Sed: заменить серию точек одним подчеркиванием - PullRequest
4 голосов
/ 10 июля 2011

Я хочу сделать простую замену строк в Bash на sed. Я Ubuntu 10.10.

Просто посмотрите на следующий код, это не требует пояснений:


name="A%20Google.."
echo $name|sed 's/\%20/_/'|sed 's/\.+/_/'

Я хочу получить A_Google_, но я получаю A_Google..

Часть sed 's/\.+/_/' явно неверна.

Кстати, sed 's/\%20/_/' и sed 's/%20/_/' оба работают. Что лучше?

Ответы [ 2 ]

5 голосов
/ 10 июля 2011

sed говорит о базовых регулярных выражениях POSIX, которые не включают + в качестве метасимвола. Портативно, перепишите, чтобы использовать *:

sed 's/\.\.*/_/'

или если все, что вас когда-либо будет волновать, это Linux, вы можете использовать различные GNU-измы:

sed -r 's/\.\.*/_/'    # turn on POSIX EREs (use -E instead of -r on OS X)
sed 's/\.\+/_/'        # GNU regexes invert behavior when backslash added/removed

Этот последний пример отвечает на ваш другой вопрос: символ, который является буквальным при использовании как есть, может иметь особое значение при обратной косой черте, и даже если в данный момент % не имеет специального то есть, когда речь идет об обратном слое, будущее не означает, что \% безопасно.

Дополнительное примечание: вам не нужны две отдельные команды sed в конвейере.

echo $name | sed -e 's/\%20/_/' -e 's/\.+/_/'

(Кроме того, вам нужно делать это только один раз для каждой строки или для всех случаев? Возможно, вы захотите модификатор /g.)

2 голосов
/ 10 июля 2011

Команда sed не понимает +, поэтому вам придется развернуть ее вручную:

sed 's/\.\.*/_/'

Или скажите sed, что вы хотите использовать расширенные регулярные выражения:

sed -r 's/\.+/_/' # GNU
sed -E 's/\.+/_/' # OSX

Какой переключатель, -r или -E, зависит от вашего sed, и он может даже не поддерживать расширенные регулярные выражения, поэтому переносимое решение заключается в использовании \.\.* вместо \.+. Но, поскольку вы работаете в Linux, у вас должен быть GNU sed, поэтому sed -r должен справиться с задачей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...