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

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

У нас есть следующая строка в файле на Linux:

discovery.uri=http://master.navada.com:8800

мы хотим добавить слово kokoперед master, поэтому я просто делаю:

sed –i 's/master/kokomaster/' file

который дает:

discovery.uri=http://kokomaster.navada.com:8800

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

Например, в следующий раз, когда мы запустим

sed –i 's/master/kokomaster/' file

строка будет иметь вид:

discovery.uri=http://kokokokomaster.navada.com:8800

решение1

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или какой-либо другой подходящий инструмент, специально написанный для обработки файлов этого формата.

решение2

Использовать

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

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

решение3

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

sed -i sX/masterX/kokomasterX file

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

решение4

Я использовал следующую команду 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

Связанный контент