SED условно добавить в строку после сопоставления - PullRequest
1 голос
/ 11 апреля 2019

У меня есть файл (test) со следующим содержимым, которое необходимо отредактировать.

test

foo:
bar:hello

В настоящее время я использую sed для соответствияшаблон и добавить строку в конец строки.

sed -ie "/^bar/ s/$/,there" test

Что дает мне ожидаемый результат, то есть

foo:
bar:hello,there

Но проблема в том, что запятая (,) должна бытьтам, когда строка не заканчивается :.иначе это становится как:

sed -ie "/^foo/ s/$/,there" test

Выход:

foo:,there
bar:hello

Требование:

foo:there
bar:hello

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

PS: я не могу установитьотдельный пакет.

Ответы [ 4 ]

3 голосов
/ 11 апреля 2019

Вот один из способов использования t после успешной замены для перехода от второй команды s///:

$ cat test
foo:
bar:
bar:hello
bar:
bar:hello
bar:
bar:hello

$ sed '/^bar/ {s/:$/:there/;t;s/$/, there/}' test 
foo:
bar:there
bar:hello, there
bar:there
bar:hello, there
bar:there
bar:hello, there
3 голосов
/ 11 апреля 2019

Сохраняйте это простым и просто используйте awk:

$ awk '/^foo/{$0 = $0 (/:$/ ? "" : ",") "there"} 1' file
foo:there
bar:hello

$ awk '/^bar/{$0 = $0 (/:$/ ? "" : ",") "there"} 1' file
foo:
bar:hello,there

Обратите внимание, как все исходная строка (foo или bar), :, ,, $ и текст замены (there) указаны только один раз? Это одна из вещей, которые вам нужны в программном обеспечении - минимальная избыточность.

Вышеописанное будет работать с использованием любого awk в любой оболочке на любом компьютере UNIX.

2 голосов
/ 11 апреля 2019

Шаблоны перед вашими командами sed - это ваши условия. Вы должны знать, что вы можете указать несколько команд -e для sed.

Вот ваш код снова, но я игнорирую foo и bar. Я обращаю внимание только на последний символ:

sed -i -e '/[^:]$/s/$/,there/' -e '/:$/s/$/there/' test

/ [^:] $ / - любой символ, который не является двоеточием в конце строки. /: $ / это дополнение (любая строка, оканчивающаяся двоеточием).

Вот результаты:

$ sed  -e '/[^:]$/s/$/,there/' -e '/:$/s/$/there/' test
foo:there
bar:hello,there
0 голосов
/ 12 апреля 2019

попробуйте GNU SED для обоих,

sed -E '/^(foo|bar)/ s/:$/&there/;n; s/[^:]$/&,there/' test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...