如何解决如何防止sed中后续的s ///替换的空模式替换?
a=a
b=ab
c=''
d=''
echo ac | sed "s/$a/$b/;"
abc
echo ac | sed "s/$a/$b/; s/$c/$d/"
bc
sed在上一个示例中删除了字符'a',因为当sed传递给后继的s命令时,如果使用s模式为空,则使用前一个,在这种情况下,用$ a代替空的$ c,即'a '。
The POSIX specification for sed
如果RE为空(即未指定任何模式),则sed的行为 就像在上一个应用的命令中使用的最后一个RE一样 地址或作为替代命令的一部分)。
在真实脚本中,变量$ c $ d可以为空或定义。对于已定义的变量$ c $ d,必须执行后续的s命令,但是对于sed中的空变量,如何防止使用后续的s命令替换?
解决方法
严格来说,sed
没有明智的方式使第二个替换条件以$c
的空性为条件。 sed
不是为这种事情设计的。
但是,您可以整理出可以满足您需求的东西。例如,您可以使用“ noop”操作将默认正则表达式重置为非常不可能的值:
$ echo ac | sed "s/$a/$b/; /^x\{80\}$/h; s/$c/$d/"
abc
这是一个适当的障碍。一方面,sed没有真正的障碍-在此示例中,我滥用了h
。另一方面,您总是冒着“极不可能”实际发生的风险。
最好在外壳程序包装中检查$c
,如果它为空,则只用第一个替换调用sed
。
如果变量为空,请不要这样做:
sed "s/$a/$b/; ${c:+s/$c/$d/}"
${parameter:+word}
是variable expansions之一-如果var
为null或未设置,如果扩展为空,则使用word
的扩展。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。