为什么 sed s/// (空模式和替换)删除特定字符串?

为什么 sed s/// (空模式和替换)删除特定字符串?

我有两个文件:junk.txt 和 lines.txt

$>cat junk.txt
This is a junk text
$>cat lines.txt
Line1
Line2
Line3
Line4

当我触发以下sed脚本时

 sed -i -e  "/Line3/r junk.txt" -e "s///" lines.txt

我得到这个输出:

Line1
Line2

This is a junk text
Line4

正如你所看到的,Line3已经不存在了。好的,该/Line3/r junk.txt部分在lines.txt 中找到与Line3 匹配的文本,并附加junk.txt 的内容。但为什么该s///命令会完全删除匹配的行呢?

老实说,这就是我需要的行为,但我想知道为什么会这样。

答案1

s当使用空正则表达式调用编辑命令时,它会重用最近使用的表达式。在这种情况下,它会重用Line3之前的匹配。这适用于命令和地址范围中//的(空正则表达式) 。s

如果没有此功能,您的命令也可以编写为

sed -i -e '/Line3/r junk.txt' -e 's/Line3//' lines.txt

Line3文本被删除,因为它没有被替换。

有时你会在像这样的结构中看到这一点

/expression/ {
    s//replacement/
    # other code here
}

POSIX 规范sed将其表述为

如果 RE 为空(即未指定模式),sed 的行为应如同指定了最后应用的命令中使用的最后一个 RE(作为地址或作为替代命令的一部分)。

相关内容