如果第一个替换失败,是否可以告诉sed执行后续替换?

时间:2018-09-25 20:37:08

标签: sed

我可以将变量传递给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 :(得分:3)

由于//重用了最后一个正则表达式,因此您可以在sed程序前添加无害命令,该命令使用的正则表达式将不会匹配任何内容:

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

答案 1 :(得分:2)

您可以切换到awk

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