Невозможно найти шаблон sed, который работает - PullRequest
1 голос
/ 13 апреля 2011

Я пытаюсь выполнить замену строки в нескольких сотнях конфигурационных файлов awstats, и для этого использую sed.Однако у меня возникают проблемы при получении рабочего шаблона.

Если говорить точнее, я пытаюсь преобразовать эту строку в конфигах:

HostAliases="REGEX[^\.*example\.com$]"

в эту:

HostAliases="REGEX[\.example\.com$]"

, где example\.com - вариант.

Я пробовал десятки вариантов команды sed.Например:

sed -i 's/^HostAliases="REGEX[^\.*/HostAliases="REGEX[\./' /etc/awstats/*.conf

sed -i 's/REGEX[^\.*/REGEX[\./' /etc/awstats/*.conf

, но каждый раз появляется сообщение об ошибке: sed: -e expression #1, char 49: unterminated 's' command

Проблема, вероятно, связана с экранированием некоторых символов, но я не могу понять, какие из нихили как избежать их.Я хочу сделать шаблон достаточно конкретным, чтобы избежать случайного совпадения с другими строками в конфигурации, поэтому было бы неплохо включить HostAliases.

Может ли какой-нибудь sed-гуру указать мне правильное направление?

Ответы [ 4 ]

3 голосов
/ 13 апреля 2011

Первый аргумент 's' сам по себе является регулярным выражением.Таким образом, вы должны экранировать (с \) специальные символы.В вашем случае это [, \, . и *.Так и должно быть:

sed -i 's/^HostAliases="REGEX\[^\\\.*/HostAliases="REGEX[\./' /etc/awstats/*.conf
sed -i 's/REGEX\[^\\\.\*/REGEX[\./' /etc/awstats/*.conf
1 голос
/ 13 апреля 2011

Вам также нужно экранировать специальные символы регулярного выражения, например:

sed -i 's/REGEX\[\^\\.\*/REGEX[\\./' /etc/awstats/*.conf
1 голос
/ 13 апреля 2011

Это то, что вы имеете в виду?

$ echo 'HostAliases="REGEX[^\.*example\.com$]"' | sed 's/^HostAliases=\"REGEX\[\^\\\.\*/HostAliases="REGEX[\\\./'

Выходы:

HostAliases="REGEX[\.example\.com$]"
0 голосов
/ 13 апреля 2011

Вы забыли избежать некоторых символов, таких как ^ и [. Ваш sed будет примерно таким:

sed -e 's/REGEX\[\^\.*/REGEX\[/' -i /etc/awstats/*conf
...