2012-06-01 4 views
3

Учитывая следующее, я хотел бы прокомментировать строки, начинающиеся с 1 или 2 или 3Поиск и замена регулярных выражений в VI, разъяснение необходимости

Some text 
1 101 12 
1 102 13 
2 200 2 
// Some comments inside 
2 202 4 
2 201 7 
3 300 0 
3 301 7 
Some other text 

следующее регулярное выражение (кажется,) выглядят (а) право, и тем не менее он не работает ..

%s/^([123])(.+)/#\1\2/g 

Тем же регулярное выражение соответствует, когда используется

задать расширенный
egrep '^([123])(.+)' file_name 

Пожалуйста, помогите мне понять, почему этот поиск и замена не работает в VI

+0

FWIW, 'egrep' использует другой синтаксис regex (' e' означает расширенный). Если вы будете использовать 'grep', это тоже не сработает. –

+0

Спасибо Феликс. Я сохранил ссылку, которую вы опубликовали. Это хороший сайт http://www.lagmonster.org/docs/vi.html#re – JAM

ответ

3

Вам необходимо избегать символов: ()+. Таким образом, вы могли бы сделать %s/^\([123]\)\(.\+\)/#\1\2/g, но, похоже, проще: :g/^[123]/s/^/#

Обратите внимание, что vi имеет различные варианты изменения значения символов в шаблонах (help magic). В частности, вы можете использовать 'очень магию' и сделать: :%s/\v^([123].+)/#\1/g (обратите внимание, что g флага полностью избыточный здесь!)

+0

Очень приятно. Благодаря! – JAM

0

В Perl

my $t = "Some text 
1 101 12 
1 102 13 
2 200 2 
2 202 4 
2 201 7 
3 300 0 
3 301 7 
Some other text"; 

foreach (split /^/, $t) { 
    $_ =~ s/^([1-3])/# $1/; 
    print $_; 
} 

Результат:

Some text 
# 1 101 12 
# 1 102 13 
# 2 200 2 
# 2 202 4 
# 2 201 7 
# 3 300 0 
# 3 301 7 
Some other text 
Смежные вопросы