vi: Substitute multiple lines according the given pattern ?
-
- Уже с Приветом
- Posts: 816
- Joined: 10 Apr 2000 09:01
vi: Substitute multiple lines according the given pattern ?
Как заменить в vi во всем файле одну подстроку на другую более менее понятно:
:g/aaaa/s//bbbb/g
И то если в одной строке несколько раз встречается aaaa то замена произойдет только один раз.
А вот как заменить сразу несколько строк удовлетворяющих обределенному patternu ?
Например заменить/удалить из файла все конструкции типа:
CREATE .... INDEX .....
(
...
...
...
);
:g/aaaa/s//bbbb/g
И то если в одной строке несколько раз встречается aaaa то замена произойдет только один раз.
А вот как заменить сразу несколько строк удовлетворяющих обределенному patternu ?
Например заменить/удалить из файла все конструкции типа:
CREATE .... INDEX .....
(
...
...
...
);
Lets smile just when we really want to …
-
- Уже с Приветом
- Posts: 13681
- Joined: 16 Jan 2001 10:01
Re: vi: Substitute multiple lines according the given patter
:g/aaaa/s//bbbb/gm ???
-
- Уже с Приветом
- Posts: 816
- Joined: 10 Apr 2000 09:01
Re: vi: Substitute multiple lines according the given patter
Palych wrote::g/aaaa/s//bbbb/gm ???
Не работает
Lets smile just when we really want to …
-
- Уже с Приветом
- Posts: 2506
- Joined: 13 Jan 2003 22:34
- Location: Kiev :: Los Angeles, CA
Re: vi: Substitute multiple lines according the given patter
Я использюю VIM (http://vim.sf.net), так что не знаю или работает в vanilla VI
:%s/aaaa/bbbb/g заменит все встречающиеся aaaa на bbbb
Насчет multiple lines: :help \n. В версиях 6.1+ (или может 6.2+?) можно match multi-line patterns, а удалить их: :%s/blah//g
viv wrote:Как заменить в vi во всем файле одну подстроку на другую более менее понятно:
:g/aaaa/s//bbbb/g
И то если в одной строке несколько раз встречается aaaa то замена произойдет только один раз.
:%s/aaaa/bbbb/g заменит все встречающиеся aaaa на bbbb
А вот как заменить сразу несколько строк удовлетворяющих обределенному patternu ?
Например заменить/удалить из файла все конструкции типа:
CREATE .... INDEX .....
(
...
...
...
);
Насчет multiple lines: :help \n. В версиях 6.1+ (или может 6.2+?) можно match multi-line patterns, а удалить их: :%s/blah//g
-
- Уже с Приветом
- Posts: 2846
- Joined: 28 Jun 2000 09:01
- Location: Milwaukee, WI
Re: vi: Substitute multiple lines according the given pattern ?
viv wrote:Как заменить в vi во всем файле одну подстроку на другую более менее понятно:
:g/aaaa/s//bbbb/g
И то если в одной строке несколько раз встречается aaaa то замена произойдет только один раз.
А вот как заменить сразу несколько строк удовлетворяющих обределенному patternu ?
Например заменить/удалить из файла все конструкции типа:
CREATE .... INDEX .....
(
...
...
...
);
Я делаю это примерно так:
Code: Select all
perl -e '@A=<>; $A=join "", @A; $A =~ s /CREATE.*INDEX.*\(.*\)//mg; print $A' < file.sql
Я еще подумаю, можеть быть получится поэлегантнее вариант
moria# show running-config
-
- Уже с Приветом
- Posts: 816
- Joined: 10 Apr 2000 09:01
-
- Уже с Приветом
- Posts: 13681
- Joined: 16 Jan 2001 10:01
-
- Уже с Приветом
- Posts: 816
- Joined: 10 Apr 2000 09:01
Palych wrote:viv wrote:Спасибо за варианты !
Еще вопрос в догонку как заменить чтото на перевод строки ? И наоборот заменить перевод строку на какое-нибудь слово ? Идея понятна да ?
Снвчала слепить все в одну строку заменить и разбить обратно.
:0,$ s/\n/someword/g
Как ни странно \n воспринимается в vim как обычное n
Lets smile just when we really want to …
-
- Уже с Приветом
- Posts: 13681
- Joined: 16 Jan 2001 10:01
viv wrote:Palych wrote:viv wrote:Спасибо за варианты !
Еще вопрос в догонку как заменить чтото на перевод строки ? И наоборот заменить перевод строку на какое-нибудь слово ? Идея понятна да ?
Снвчала слепить все в одну строку заменить и разбить обратно.
:0,$ s/\n/someword/g
Как ни странно \n воспринимается в vim как обычное n
(tr '\n' '\r'; echo)|sed 's/From/To/g'|tr '\r' '\n' ???
-
- Уже с Приветом
- Posts: 676
- Joined: 28 Apr 2003 02:06
- Location: Vilnius->Boston
И как эта радость обработает файло видаidle0 wrote:Вот v2:Code: Select all
perl -e '$_=join "", <>; s/CREATE.*INDEX.*\(.*\)//mg; print' < file.sql
CREATE blabala;
select bla;
blabla INDEX bla (
bla bla ;
bla (bla);
bla bla bla );
Вытрет все нафик, или вытрет только часть? И какую часть? А главное зачем, ведь согласно первоначальной идее не должно делать ничего вообще
-
- Уже с Приветом
- Posts: 2846
- Joined: 28 Jun 2000 09:01
- Location: Milwaukee, WI
r00t wrote:И как эта радость обработает файло видаidle0 wrote:Вот v2:Code: Select all
perl -e '$_=join "", <>; s/CREATE.*INDEX.*\(.*\)//mg; print' < file.sql
CREATE blabala;
select bla;
blabla INDEX bla (
bla bla ;
bla (bla);
bla bla bla );
Вытрет все нафик, или вытрет только часть? И какую часть? А главное зачем, ведь согласно первоначальной идее не должно делать ничего вообще
Ну так надо поправить немного regexp, я просто хотел продемонстрировать
как делать multi-line search and replace. А так по уму надо SQL парсер на
flex-e замочалить
moria# show running-config
-
- Уже с Приветом
- Posts: 676
- Joined: 28 Apr 2003 02:06
- Location: Vilnius->Boston