Можно ли сказать sed выполнить последующие замены, если первая не удалась? - PullRequest
0 голосов
/ 25 сентября 2018

Я могу передать переменную в команду подстановки sed следующим образом:

$ myvar=helloworld
$ sed -r "s/$myvar/hellofoo/g; s/foo/bar/g" <(echo helloworld foo)
hellobar bar

Но если переменная пуста, произойдет сбой:

$ myvar=
$ sed -r "s/$myvar/hellofoo/g; s/foo/bar/g" <(echo helloworld foo)
sed: -e expression #1, char 0: no previous regular expression

Можно ли просто пропуститьПервая замена, а выполнить вторую?Я хотел бы иметь вывод, похожий на этот:

$ myvar=
$ sed -r "s/$myvar/hellofoo/g; s/foo/bar/g" <(echo helloworld foo)
helloworld bar

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Поскольку // повторно использует последнее регулярное выражение, вы можете добавить в свою программу sed безобидную команду, в которой используется регулярное выражение, которое никогда не будет ничего совпадать:

$ myvar=
$ sed -r "/$^/ =; s/$myvar/hellofoo/g; s/foo/bar/g" <(echo helloworld foo)
helloworld bar
0 голосов
/ 26 сентября 2018

Вы можете переключиться на awk

awk -v var="$myvar" '(var!=""){gsub(var,"hellofoo")}{gsub("foo","bar")}1' <(echo helloworld foo)
...