команда sed, которая работает для Solaris, Linux и HPUX

Мне нужно изменить директиву в файле конфигурации и заставить ее работать в Linux, но в Solaris говорится, что команда искажена.

Вот директива

    enable-cache            passwd          yes

Мне нужно просто заменить «да» на «нет». Как я могу использовать sed, который будет работать для Solaris, HPUX и Linux?

Вот команда sed, которая работала в Linux. Solaris не любит -r

sed -r 's/^([[:space:]]*check-files[[:space:]]+passwd[[:space:]]+)yes([[:space:]]*)$/\1no\2/' inputfile

Конечная цель - поместить эту команду в сценарий и запустить его по всему предприятию.

Спасибо

Грег

Я также вчера опубликовал нечто подобное, что работало для Linux, но не для других.


person user1967720    schedule 23.05.2013    source источник
comment
Что это за команда sed, которая уже работает в Linux?   -  person Birei    schedule 24.05.2013
comment
Я добавил команду в пост выше   -  person user1967720    schedule 24.05.2013
comment
Преобразуйте это регулярное выражение ERE в BRE и удалите -r.   -  person Kevin    schedule 24.05.2013
comment
Не уверен, что такое ERE и BRE. Могли бы вы объяснить?   -  person user1967720    schedule 24.05.2013


Ответы (3)


В Solaris есть / usr / bin / sed и / usr / xpg4 / bin / sed. Ни один из них не поддерживает параметр -r, который в Linux должен использовать расширенное регулярное выражение. sed в Solaris не имеет возможности установить такое регулярное выражение. Вы можете использовать другие инструменты, в частности awk, если вам нужна более простая переносимость. Или вам придется использовать два вида регулярных выражений: один с -r и расширенное регулярное выражение, один без -r и другой регулярное выражение. И вы, вероятно, захотите указать / usr / xpg4 / bin / sed только для ящиков Solaris:

#!/bin/bash
sun=`expr index Solaris $(uname -a)`
if [ $sun -ne 0 ] ; then
   /usr/xpg4/bin/sed [longer regex here ] 
else
  /usr/bin/sed -r [ extended regex here ]
fi 
person jim mcnamara    schedule 23.05.2013

Это не строго эквивалентно, поскольку :space: соответствует большему количеству символов, но я предполагаю, что в вашем файле должны быть только пробел и табуляция. Я использую только стандартные команды оболочки и sed, поэтому это должно работать в Solaris, Linux и HP-UX:

space=$(printf " \t")
sed 's/^\(['"$space"']*check-files['"$space"']+passwd['"$space"']+\)yes\(['"$space"']*\)$/\1no\2/' inputfile

Обратите внимание, что ваш скрипт не соответствует вашему образцу директивы, как ожидает check-files, но ему задано enable-cache.

person jlliagre    schedule 23.05.2013

GNU [[:space:]] обычно эквивалентен просто [ \t]. И вам нужно избегать скобок. И + не поддерживается. Итак, с этими заменами ваша рабочая sed команда станет:

sed 's/^\([ \t]*check-files[ \t][ \t]*passwd[ \t][ \t]*\)yes\([ \t]*\)$/\1no\2/' inputfile

Дополнительное примечание: в старом sed's нет опции -i для внесения изменений на месте, поэтому вам может потребоваться сначала скопировать цель во временный файл и применить к нему sed, перенаправив вывод на цель.

person Joseph Quinsey    schedule 27.06.2013