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

Mik*_*yev 3 sed

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

$>cat junk.txt
This is a junk text
$>cat lines.txt
Line1
Line2
Line3
Line4
Run Code Online (Sandbox Code Playgroud)

当我触发以下sed脚本时

 sed -i -e  "/Line3/r junk.txt" -e "s///" lines.txt
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

Line1
Line2

This is a junk text
Line4
Run Code Online (Sandbox Code Playgroud)

如您所见,Line3不再存在。好的,这/Line3/r junk.txt部分在lines.txt中找到了与Line3匹配的文本,并追加了junk.txt的内容。但是为什么该s///命令会完全删除匹配的行?

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

Kus*_*nda 5

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

您的命令也可以在没有此功能的情况下编写为

sed -i -e '/Line3/r junk.txt' -e 's/Line3//' lines.txt
Run Code Online (Sandbox Code Playgroud)

Line3因为它是由什么代替文字被删除。

您有时会在类似的结构中看到这一点

/expression/ {
    s//replacement/
    # other code here
}
Run Code Online (Sandbox Code Playgroud)

POSIX规范sed制定本为

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