为什么这些花括号在 sed 中是必要的?

the*_*fog 9 sed

我想在 sed 中进行范围有限的搜索,所以我尝试了

sed -n '195,210 /add/ p' <file>
Run Code Online (Sandbox Code Playgroud)

哪个给了

sed:-e 表达式 #1,字符 9:未知命令:`/'

纯粹作为猜测,我尝试添加花括号:

sed -n '195,210{/add/p}' <file>
Run Code Online (Sandbox Code Playgroud)

它是成功的,但我试图理解为什么它与添加的大括号一起工作。
我有点明白,在 bash 中,大括号可以分隔表达式(并可能增加其执行顺序),但在 sed 的情况下,这些大括号在做什么?

相关信息

$ sed --version
sed (GNU sed) 4.2.2

$ bash --version
GNU bash, version 4.3.11
Run Code Online (Sandbox Code Playgroud)

don*_*sti 12

根据POSIX标准的页面sed

该脚本应包含以下形式的编辑命令:

[地址[,地址]]函数

其中function表示sed编辑命令列表中的单字符命令动词 ,后跟任何适用的参数。

因此,地址后的第一个非空白字符被视为命令动词 - 在您的特定情况下,/因此是错误:char 9: unknown command: '/'.
大括号被进一步引用:

[ 2addr ] {编辑命令
编辑命令
...
}
    仅当模式空间被选中时,才执行一系列 `sed` 编辑命令。…

[ 2addr ] 是允许地址的最大数量为两个的指示符。

为了澄清上述观点,地址部分sed(1)说:

Sed命令可以在没有地址的情况下给出,在这种情况下,将对所有输入行执行命令;具有一个地址,在这种情况下,该命令将仅针对与该地址匹配的输入行执行;或者有两个地址,在这种情况下,将针对所有与从第一个地址开始并继续到第二个地址的行的包含范围匹配的输入行执行命令。地址范围需要注意三点:语法是addr1 , addr2(即地址之间用逗号分隔);
????????…… (以及与本次讨论无关的其他内容) ……

GNU信息页面(info sed具有的类似的描述{},在“3.4经常使用的命令”:

{命令}
    一组命令可以包含在{}字符之间。当您希望由单个地址(或地址范围)匹配触发一组命令时,这特别有用。

否则,大括号用于在同一地址应用多个命令或嵌套地址。
这里的标准不是很明确1但左大括号{ 实际上是一个命令,它启动一组其他 sed 命令(该组以右大括号结束})。

而且,在真正发生风险TL; DR,问题是195210/add/全部地址sed三个地址不能调用任何命令。因此,使您的命令起作用的方法是{在地址范围上调用命令195,210,然后(在该范围内)p在地址上调用命令/add/


1:
尽管如果您阅读整页,会提到:
{abcirtw:#之外的命令动词可以跟...