Поиск и замена sed при наличии точек и подчеркиваний

Как заменить foo. с foo_ с sed просто работает

sed 's/foo./foo_/g' file.php

не работает. Спасибо!

Ответы

Ответ 1

Сбегите .:

sed 's/foo\./foo_/g' file.php

Пример:

~$ cat test.txt 
foo.bar
~$ sed 's/foo\./foo_/g' test.txt 
foo_bar

Ответ 2

Уберите точку с помощью \

sed 's/foo\./foo_/g' file.php

Если вы найдете комбинацию/и\запутываете, вы можете использовать другой символ 'separator'

sed 's#foo\.#foo_#g

Второй символ после s может быть любым, и sed будет использовать этот символ в качестве разделителя.

Ответ 3

Интересно, что если вы хотите найти и заменить только точку, вы должны поместить точку в набор символов. Исключение только одной точки в команде sed по какой-то причине не работает. Точка все еще расширяется до одиночной символьной карты.

$ bash --version  # Ubuntu Lucid (10.04)

GNU bash, версия 4.1.5 (1) -release (x86_64-pc-linux-gnu)

$ echo aa.bb.cc | sed s/\./-/g  # replaces all characters with dash

'--------'

$ echo aa.bb.cc | sed s/[.]/-/g  # replaces the dots with a dash

аа-бб-сс

С добавлением ведущих символов в поиск побег работает.

$ echo foo. | sed s/foo\./foo_/g  # works

Foo _

Конечно, также работает точка в наборе символов.

$ echo foo. | sed s/foo[.]/foo_/g  # also works

Foo _

- Пол

Ответ 4

Вам нужно избегать точки - неопределенная точка будет соответствовать любому символу после foo.

sed 's/foo\./foo_/g'

Ответ 5

Для себя работает sed 's/foo\./foo_/g'. Но вы также можете попробовать:

sed -e 's/foo\./foo_/g'

и

sed -e "s/foo\\./foo_/g"

и

sed 's/foo[.]/foo_/g'