2014-12-17 3 views
-4

Я получил файл с несколькими (1000+) записи, как:VIM - Заменить на основе поиска регулярных выражений

lbc3.*' 

ssa2.*' 

lie1.*' 

sld0.*' 

ssdasd.*' 

я могу найти их все:

/s[w|l].*[0-9].*$ 

Что я хочу чтобы заменить конечную часть каждого шаблона, найденного с помощью.. * '

Я не могу сделать :%s//s[w|l].*[0-9].*$/\\\\\.\*', потому что он заменит всю строку, и мне нужно заменить ее только с . ' до \. '

Так выходной файл llike:

lbc3\\.*' 

ssa2\\.*' 


lie1\\.*' 

sld0\\.*' 

ssdasd\\.*' 

Спасибо.

+1

Как 's [w | l]' соответствует 'lbc3'? Неужели это будет только одна строка в вашем примере? – arco444

+0

Почему вы хотите изменить 'ssdasd \\. * ''? Что вы подразумеваете под 's [w | l]'? –

+1

Это в основном дубликат: http://stackoverflow.com/questions/27525223/ – arco444

ответ

1

В общем, решение заключается в использовании захвата . Помещенный \( ... \) вокруг части регулярного выражения, который соответствует то, что вы хотите сохранить, и использовать \1, чтобы включить все, что соответствует той части регулярного выражения в строке замены:

s/\(s[w|l].*[0-9].*\)\.\*'$/\1\\.*'/ 

Поскольку вы на самом деле просто вставить обратную косую черту между двумя строками, которые вы не меняется, вы можете использовать второй набор скобок и \2 для второго:

s/\(s[w|l].*[0-9].*\)\(\.\*'\)$/\1\\\2/ 

в качестве альтернативы, вы можете использовать \zs и \ze разграничить только часть строка, которую вы хотите скопировать ace:

s/s[w|l].*p0-9].*\zs\ze\*\'$/\\/ 
+2

Забудьте о группе захвата, используйте '\ zs'! –

+0

Хорошее предложение, @PeterRincker. Добавил его к ответу. –

Смежные вопросы