подстановочный знак sed - PullRequest
5 голосов
/ 07 июня 2011

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

Команда sed, которая у меня есть для этого:

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"

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

Ответы [ 4 ]

7 голосов
/ 07 июня 2011

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

So

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".

См. Группировка регулярных выражений .

2 голосов
/ 07 июня 2011

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

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

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

2 голосов
/ 07 июня 2011

Вы должны использовать обратная ссылка в sed.Используйте это так:

sed 's/\(=.*\)tenure/\1disposition/g'
2 голосов
/ 07 июня 2011
sed 's/\(=.*\)tenure/\1disposition/g' file.txt
...