vi: Substitute multiple lines according the given pattern ?

User avatar
viv
Уже с Приветом
Posts: 816
Joined: 10 Apr 2000 09:01

vi: Substitute multiple lines according the given pattern ?

Post by viv »

Как заменить в vi во всем файле одну подстроку на другую более менее понятно:

:g/aaaa/s//bbbb/g

И то если в одной строке несколько раз встречается aaaa то замена произойдет только один раз.

А вот как заменить сразу несколько строк удовлетворяющих обределенному patternu ?

Например заменить/удалить из файла все конструкции типа:

CREATE .... INDEX .....
(
...
...
...
);
Lets smile just when we really want to …
Palych
Уже с Приветом
Posts: 13682
Joined: 16 Jan 2001 10:01

Re: vi: Substitute multiple lines according the given patter

Post by Palych »

:g/aaaa/s//bbbb/gm ???
User avatar
viv
Уже с Приветом
Posts: 816
Joined: 10 Apr 2000 09:01

Re: vi: Substitute multiple lines according the given patter

Post by viv »

Palych wrote::g/aaaa/s//bbbb/gm ???


Не работает :cry:
Lets smile just when we really want to …
Palych
Уже с Приветом
Posts: 13682
Joined: 16 Jan 2001 10:01

Post by Palych »

:0,$ s/aaaa/bbbb/gm ??
User avatar
theukrainian
Уже с Приветом
Posts: 2506
Joined: 13 Jan 2003 22:34
Location: Kiev :: Los Angeles, CA

Re: vi: Substitute multiple lines according the given patter

Post by theukrainian »

Я использюю VIM (http://vim.sf.net), так что не знаю или работает в vanilla VI
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
User avatar
idle0
Уже с Приветом
Posts: 2846
Joined: 28 Jun 2000 09:01
Location: Milwaukee, WI

Re: vi: Substitute multiple lines according the given pattern ?

Post by idle0 »

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
User avatar
idle0
Уже с Приветом
Posts: 2846
Joined: 28 Jun 2000 09:01
Location: Milwaukee, WI

Post by idle0 »

Вот v2:

Code: Select all

perl -e '$_=join "", <>; s/CREATE.*INDEX.*\(.*\)//mg; print' < file.sql
moria# show running-config
User avatar
viv
Уже с Приветом
Posts: 816
Joined: 10 Apr 2000 09:01

Post by viv »

Спасибо за варианты !

Еще вопрос в догонку как заменить чтото на перевод строки ? И наоборот заменить перевод строку на какое-нибудь слово ? Идея понятна да ?

Снвчала слепить все в одну строку заменить и разбить обратно.
Lets smile just when we really want to …
Palych
Уже с Приветом
Posts: 13682
Joined: 16 Jan 2001 10:01

Post by Palych »

viv wrote:Спасибо за варианты !

Еще вопрос в догонку как заменить чтото на перевод строки ? И наоборот заменить перевод строку на какое-нибудь слово ? Идея понятна да ?

Снвчала слепить все в одну строку заменить и разбить обратно.

:0,$ s/\n/someword/g
User avatar
viv
Уже с Приветом
Posts: 816
Joined: 10 Apr 2000 09:01

Post by viv »

Palych wrote:
viv wrote:Спасибо за варианты !

Еще вопрос в догонку как заменить чтото на перевод строки ? И наоборот заменить перевод строку на какое-нибудь слово ? Идея понятна да ?

Снвчала слепить все в одну строку заменить и разбить обратно.

:0,$ s/\n/someword/g


Как ни странно \n воспринимается в vim как обычное n :pain1:
Lets smile just when we really want to …
Palych
Уже с Приветом
Posts: 13682
Joined: 16 Jan 2001 10:01

Post by Palych »

viv wrote:
Palych wrote:
viv wrote:Спасибо за варианты !

Еще вопрос в догонку как заменить чтото на перевод строки ? И наоборот заменить перевод строку на какое-нибудь слово ? Идея понятна да ?

Снвчала слепить все в одну строку заменить и разбить обратно.

:0,$ s/\n/someword/g


Как ни странно \n воспринимается в vim как обычное n :pain1:


(tr '\n' '\r'; echo)|sed 's/From/To/g'|tr '\r' '\n' ???
User avatar
r00t
Уже с Приветом
Posts: 676
Joined: 28 Apr 2003 02:06
Location: Vilnius->Boston

Post by r00t »

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 );

Вытрет все нафик, или вытрет только часть? И какую часть? А главное зачем, ведь согласно первоначальной идее не должно делать ничего вообще :(
User avatar
idle0
Уже с Приветом
Posts: 2846
Joined: 28 Jun 2000 09:01
Location: Milwaukee, WI

Post by idle0 »

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 замочалить :mrgreen:
moria# show running-config
User avatar
r00t
Уже с Приветом
Posts: 676
Joined: 28 Apr 2003 02:06
Location: Vilnius->Boston

Post by r00t »

idle0 wrote:Ну так надо поправить немного regexp, я просто хотел продемонстрировать
как делать multi-line search and replace. А так по уму надо SQL парсер на
flex-e замочалить :mrgreen:
Вот тот-то, что придется парсер писать, а то одним regexp'ом нормально такое неотпарсишь.

Return to “Вопросы и новости IT”