2011-06-06 2 views
5

Я хочу сделать замену на основе шаблона. Например, измените все «владение» на «распоряжение», только если слово «владение» приходит после знака «=». В основном регулярное выражение, которое будет соответствовать этому =.*tenuresed wildcard substitution

СЕПГ команду, которую я так для этого:

sed 's/=.*tenure/=.*disposition/g' file.txt 

Однако, если я прохожу этот файл, содержащий:

blah blah blah = change "tenure" to "disposition" 

Я получаю

blah blah blah =.*disposition" to "disposition" 

вместо:

blah blah blah = change "disposition" to "disposition" 

Как сделать подстановку так, чтобы подстановочный знак в регулярном выражении не был частью целевого файла?

ответ

6

Вы должны использовать захвата группы, чтобы захватить текст, который появляется между вашим знаком равенства и «владения».

Так

sed 's/=\(.*\)tenure/=\1disposition/g' 

Обратите внимание на использование \1 ссылаться и использовать группу, которую вы захватили.

Так

echo 'blah blah blah = change "tenure" to "disposition"' | sed 's/=\(.*\)tenure/=\1disposition/g' 

мы получаем

blah blah blah = change "disposition" to "disposition". 

Regex grouping См.

2
sed 's/\(=.*\)tenure/\1disposition/g' file.txt 
2

Вы должны сохранить совпавшие символы между = и tenure, чтобы добавить их к выходу:

sed 's/=(.*)tenure/=\1disposition/g' file.txt 

Кроме того, следует добавить опцию -i к СЭД, если вы хотите редактировать файл inplace (внести изменения в сам файл).

2

Вы должны использовать backreference в sed. Используйте его так:

sed 's/\(=.*\)tenure/\1disposition/g'