sed + добавить слово перед строкой не существует

Вы можете настроить простой локальный кэширующий DNS-сервер с помощью dnsmasq и добавить в файл конфигурации одну или несколько строк

   ignore-address=

Игнорировать отвечает на запросы A-записи, которые включают указанный адрес. Ошибка не возникает, dnsmasq просто продолжает ожидать другого ответа.

3
06.06.2019, 16:27
5 ответов

Вы можете заменить немного больше, чтобы избежать этой проблемы:

sed -i sX/masterX/kokomasterX file

Это заменяет «/master», поэтому при следующем запуске ничего не будет заменено, так как «/kokomaster» не совпадает.

4
27.01.2020, 21:08
sed -i '/kokomaster/!s/master/koko&/' file

Сначала проверьте, существует ли строка kokomasterв строке, и если нет, выполните подстановку. Это почти дословный перевод фразы «но мы хотим добавить слово kokoтолько в том случае, если kokoне существует перед словом master» в sed.

&в замещающей части замены будет заменен текстом, совпадающим с частью шаблона (, т.е.master).


Прочитав комментарии (см. ниже ), вы можете захотеть использовать что-то более конкретное, что на самом деле будет изменять только часть имени сервера в URI, а не какую-либо строку masterв другом месте, даже если kokomasterпроизошло (или нет )в пути URI:

sed -i 's,^\(discovery\.uri=http://\)\(master\),\1koko\2,' file

Возможно, вам даже захочется сопоставить точную и полную строку, которую вы хотите заменить, просто чтобы избежать даже гипотетических ошибок:

sed -i 's,^\(discovery\.uri=http://\)\(master\.navada\.com:8800\)$,\1koko\2,' file

Если файл конфигурации написан в формате JSON или каком-либо другом широко известном формате, вы должны не использовать sedвообще , а jqили какой-либо другой подходящий инструмент, специально написанный для обработки файлов этого формата. формат.

6
27.01.2020, 21:08

Если вы открыты для других инструментов:

perl -i -pe 's/(?<!koko)master/kokomaster/' file

(?>!foo)является отрицательным просмотром назад , поэтому (?<!koko)masterбудет соответствовать masterтолько в том случае, если ему не предшествует koko.

2
27.01.2020, 21:08

Я использовал приведенную ниже команду awk, чтобы сделать то же самое

команда

awk '$0 !~/kokomaster/{gsub("master","kokomaster",$0)}1'  filename >file_tmp && mv file_tmp filename

выход

discovery.uri=http://kokomaster.navada.com:8800
discovery.uri=http://kokomaster.navada.com:8800
2
27.01.2020, 21:08

Используйте

sed 's/\(koko\)*master/kokomaster/'

, поэтому masterи любое количество предыдущих kokoзаменяются.

4
27.01.2020, 21:08

Теги

Похожие вопросы