>我可以将变量传递给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
由于//
重用了最后一个正则表达式,因此您可以在sed
程序前面加上一个无害的命令,该命令使用永远不会匹配任何内容的正则表达式:
$ myvar=
$ sed -r "/$^/ =; s/$myvar/hellofoo/g; s/foo/bar/g" <(echo helloworld foo)
helloworld bar
你可以切换到awk
awk -v var="$myvar" '(var!=""){gsub(var,"hellofoo")}{gsub("foo","bar")}1' <(echo helloworld foo)