Unix SED команда для замены части пары ключ-значение - PullRequest
0 голосов
/ 25 июня 2019

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

Пример

key1=123-456

Мне нужно заменить значение после дефиса новым значением.

Я получил команду, которая используется в других проектах, но я не уверен, как она работает.

Команда

[test]$ cat test_sed_key_value.txt
key1=123-456
[test]$ sed -i -e '/key1/ s/-.*$/-789/' test_sed_key_value.txt
[test]$
[test]$ cat test_sed_key_value.txt
key1=123-789
[test]$

Будет полезно, если кто-нибудь сможет объяснить, как работает приведенная выше команда, или есть более простой способ сделать это с помощью sed.

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

Вот список частей этой командной строки, каждая из которых сопровождается кратким объяснением:

sed 

какой инструмент использовать

-i

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

-e

параметр выражения: код sed для применения следует

/key1/

"адрес": только те строки процесса, к которым применяется это регулярное выражение, т.е. те, которые содержат текст "key1"

s/replacethis/withthis/

команда: выполните поиск и замену, «заменить это» и «этим» являются следующими после объяснений

-.*$

regex: (то, что на самом деле находится в командной строке вместо «replacethis»), регулярное выражение, представляющее «минус», за которым следует что угодно, в любом числе, до конца строки

-789

литерал: (что на самом деле находится в командной строке вместо «с этим») просто эта строка «-789»

test_sed_key_value.txt

параметр файла: обработать этот файл

Я не могу придумать, как сделать это проще. Показанная команда уже использует некоторые предположения о форматировании входного файла.

1 голос
/ 26 июня 2019

Я бы добавил к ответу Юнноша, что здесь "замена этого" является регулярным выражением:

-.*$

См. здесь для ознакомления с синтаксисом регулярных выражений sed в Gnu. Звездочка означает повторение предыдущего, точка означает любой символ, поэтому .* означает последовательность символов. $ - это конец строки.

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

key1=123-456, key2=abc-def

заменив его на:

key1=123-789

полностью удаляет часть key2 (поскольку .* принимает все символы после первой черты до конца строки).

Поэтому, в зависимости от формата ваших значений, вы можете предпочесть что-то вроде

-[0-9]*

(без $), означая последовательность чисел после -

или

-[0-9a-zA-Z_]

означает последовательность цифр или букв или подчеркивания после -

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...