найти и заменить в текстовом файле с помощью sed - PullRequest
1 голос
/ 19 января 2012

Я новичок в седе.

У меня есть текстовый файл, и я хочу заменить вхождение этой строки:

allow ^127\.0\.0\.1$

с этой строкой:

allow ^107\.21\.206\.35$

код, который я использовал, был следующим:

sed 's/allow ^127\.0\.0\.1$/allow ^107\.21\.206\.35$/g' test.txt

Однако id не работал. Что я сделал не так?

Спасибо

Ответы [ 3 ]

1 голос
/ 19 января 2012

Вы должны экранировать '^' и '$':

$ sed 's/allow \^127\.0\.0\.1\$/allow \^107\.21\.206\.35\$/g' test.txt

Без экранирования, '^' соответствует началу строки, а '$' соответствует концу строки.Чтобы точно соответствовать символу, они должны быть экранированы с помощью \.В большинстве реализаций sed используются базовые регулярные выражения, в которых следующие символы должны быть экранированы для буквального соответствия: ^.[$()|*+?{\

0 голосов
/ 19 января 2012

Вы должны экранировать не только \ (с другой обратной косой чертой), но и . (Регулярные выражения обрабатывают . как "соответствует любому отдельному символу"). Символы ^ и $ также зарезервированы в регулярных выражениях.

$ echo "allow ^127\.0\.0\.1$" > /tmp/test
$ cat /tmp/test
allow ^127\.0\.0\.1$
$ sed 's/allow \^127\\\.0\\\.0\\\.1\$/allow ^107\\.21\\.206\\.35$/g' -i /tmp/test
$ cat /tmp/test
allow ^107.21.206.35$

В строке замены следует экранировать \, в противном случае сингл \ будет экранирован . рядом с ним.

0 голосов
/ 19 января 2012

Это может работать для вас:

echo 'allow ^127\.0\.0\.1$' | 
sed 's/allow ^127\\.0\\.0\\.1\$/allow ^107\\.21\\.206\\.35$/'
allow ^107\.21\.206\.35$

^ и $ необходимо экранировать только в совпадающей части команды подстановки, если они находятся в начале и в конце строкисоответственно.\ необходимо избегать как в матче, так и при замене.

...