
У нас есть следующая строка в файле на 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
и любое количество предыдущих koko
s заменяются.
решение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