我有两个文件: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(作为地址或作为替代命令的一部分)。