如何防止在sed中被后续的s//(替换的空模式)替换?

如何防止在sed中被后续的s//(替换的空模式)替换?,sed,Sed,在上一个示例中,sed删除了字符“a”,因为当sed传递带有空模式的后续s命令时,将使用前一个命令,在本例中是$a,而不是空的$c,即“a” 如果RE为空(即未指定图案),则sed应正常工作 就像在应用的最后一个命令中重复使用最后一个命令一样(作为 指定了地址(或作为替换命令的一部分) 在实际脚本中,变量$c$d可以是空的,也可以是定义的。对于定义的变量$c$d,必须执行后续s命令,但如何防止在sed中出现空变量的情况下被后续s命令替换?严格来说,sed没有合理的方法使第二次替换以$c的空性为

在上一个示例中,sed删除了字符“a”,因为当sed传递带有空模式的后续s命令时,将使用前一个命令,在本例中是$a,而不是空的$c,即“a”

如果RE为空(即未指定图案),则sed应正常工作 就像在应用的最后一个命令中重复使用最后一个命令一样(作为 指定了地址(或作为替换命令的一部分)


在实际脚本中,变量$c$d可以是空的,也可以是定义的。对于定义的变量$c$d,必须执行后续s命令,但如何防止在sed中出现空变量的情况下被后续s命令替换?

严格来说,
sed
没有合理的方法使第二次替换以
$c
的空性为条件
sed
不是为这种事情设计的

然而,你可以找到一些你想要的东西。例如,可以使用“noop”操作将默认正则表达式重置为非常不可能的值:

a=a
b=ab
c=''
d=''
echo ac | sed "s/$a/$b/;"
abc
echo ac | sed "s/$a/$b/; s/$c/$d/"
bc
这是一个正确的预兆。首先,sed没有真正的noop——在本例中,我滥用了
h
。另一方面,你总是冒着“非常不可能”的风险


您最好检查shell包装中的
$c
,如果它是空的,则只调用第一次替换的
sed

严格地说,
sed
没有明智的方法使第二次替换以
$c
的空为条件
sed
不是为这种事情设计的

然而,你可以找到一些你想要的东西。例如,可以使用“noop”操作将默认正则表达式重置为非常不可能的值:

a=a
b=ab
c=''
d=''
echo ac | sed "s/$a/$b/;"
abc
echo ac | sed "s/$a/$b/; s/$c/$d/"
bc
这是一个正确的预兆。首先,sed没有真正的noop——在本例中,我滥用了
h
。另一方面,你总是冒着“非常不可能”的风险


您最好在shell包装器中检查
$c
,如果它为空,则仅在第一次替换时调用
sed

如果变量为空,则不要这样做:

$ echo ac | sed "s/$a/$b/; /^x\{80\}$/h; s/$c/$d/"
abc

${parameter:+word}
是-if
var
为null或unset,if展开为nothing,否则使用
word
的展开。

如果变量为空,就不要这样做:

$ echo ac | sed "s/$a/$b/; /^x\{80\}$/h; s/$c/$d/"
abc

${parameter:+word}
是-if
var
为null或unset,if扩展为空,否则使用
word
的扩展。

据我所知,模式/^x\{80}$/表示“xxx….xxx”(“x”重复了80次)。但是命令/^x{80}$/h到底做了什么呢?因此/^x{80}$/h将匹配80个“x”的行复制到保留空间。但在这种情况下,我滥用
h
作为noop,所以这是一个什么都不做的操作。该命令的目的仅仅是将默认正则表达式重置为一个不太可能匹配任何输入的正则表达式,这样下面的
s//
就不会做任何事情,而不会滥用h,这以前是一个不太可能的替代,这个变体是一个错误的选择吗?$a=a;b=ba;回音aa | sed“s/$a/$b/$s/^x\{80}$/$d/$s/$c/$d/;”据我所知,模式/^x\{80}$/意味着‘xxx……xxx’(‘x’重复了80次)。但是命令/^x{80}$/h到底做了什么呢?因此/^x{80}$/h将匹配80个“x”的行复制到保留空间。但在这种情况下,我滥用
h
作为noop,所以这是一个什么都不做的操作。该命令的目的仅仅是将默认正则表达式重置为一个不太可能匹配任何输入的正则表达式,这样下面的
s//
就不会做任何事情,而不会滥用h,这以前是一个不太可能的替代,这个变体是一个错误的选择吗?$a=a;b=ba;回音aa | sed“s/$a/$b/;s/^x\{80}$/$d/;s/$c/$d/;”baa