2013-05-21 7 views
0

Я пишу сценарий оболочки, который найдет и заменит строку, чтобы отключить кеширование паролей в nscd. Проблема в том, что есть тонна пробела перед и между параметрами, и я не могу найти способ с моим ограниченным знанием регулярного выражения, чтобы игнорировать пробелы и изменить «нет» на «да».sed найти/заменить строки пробелами

Вот строка, которая отображается в файле конфигурации. На всякий случай, если он не отображается должным образом, перед кэшем включения есть 8 пробелов, 12 пробелов после и 10 пробелов до нет.

enable-cache   passwd   no 

Мне в основном нужно изменить no на yes только для этой линии. У кого-нибудь есть мысли?

Благодаря

Greg

ответ

1

Чтобы показать полный пример использования (хотя и с входным сигналом заданного в командной строке, а не из файла):

$ sed -r -e \ 
    's/^([[:space:]]*enable-cache[[:space:]]+passwd[[:space:]]+)no([[:space:]]*)$/\1yes\2/' \ 
    <input-file >output-file \ 
    && mv output-file input-file 

Чтобы сделать это на месте , вы должны использовать ed или ex (оба, в отличие от sed -i, являющиеся инструментами, указанными в POSIX):

$ printf '%s\n' \ 
    '%s/\([[:space:]]*enable-cache[[:space:]]\+passwd[[:space:]]\+\)no[[:space:]]*/\1yes/' \ 
    'wq' \ 
    | ex file-to-modify -s - 
+0

Используйте 'СЭД -i (...) file' вместо' mv' – yoones

+0

@yoones Negative. 'sed -i' не совместим с POSIX. См. Http://pubs.opengroup.org/onlinepubs/007904875/utilities/sed.html –

+0

@yoones ... если вы хотите, чтобы POSIX-совместимый инструмент для редактирования на месте, это было бы ex или ed, а не sed , –

0

Соединив и закрепите деталь, начиная с enable-cache, до no, а также для соответствия no. Заменить все согласованную часть с захваченной части и yes:

sed 's/\(enable-cache[ ]*passwd[ ]*\)no/\1yes/' input 
+0

Учитывая, что исходному файлу разрешено использовать вкладки, а не пробелы (заданные как «пробелы» в вопросе, и учитывая внеполосное знание о том, что конфигурационный файл nscd не выбирает кости), писать код, предполагающий только пробелы, кажется немного рискованно. –