如何解析sed正则表达式语法?

如何解析sed正则表达式语法?,sed,Sed,我不知道如何解析这个正则表达式。这是用#来评论测试,但我的问题是 开头的“0”是什么 它与“s/test/#test/g”有什么不同?为什么代码< >代码>在中间? 非常感谢您的帮助。让我们将其分解为更小的部分: sed命令遵循以下语法: sed -i "0,/test/s//#test/g" file.txt X是一个单字母sed命令。[addr]是可选的行地址。如果指定了[addr],则命令X将仅在匹配的行上执行 及 可以通过指定两个由逗号(,)分隔的地址来指定

我不知道如何解析这个正则表达式。这是用#来评论测试,但我的问题是

  • 开头的“0”是什么
  • 它与“s/test/#test/g”有什么不同?为什么代码< >代码>在中间?

非常感谢您的帮助。

让我们将其分解为更小的部分:

sed命令遵循以下语法:

sed -i "0,/test/s//#test/g" file.txt
X是一个单字母sed命令。[addr]是可选的行地址。如果指定了[addr],则命令X将仅在匹配的行上执行

可以通过指定两个由逗号(,)分隔的地址来指定地址范围。地址范围从第一个地址匹配的位置开始匹配行,并持续到第二个地址匹配为止(包括)

0、/test/s/#test/g
的情况下,地址部分是
0、/test/
,因为
s
是命令。
0、/test/
的地址部分意味着
s
命令仅在该范围内的行上执行。如果sed命令是
s/test/#test/g
,则不会有地址部分,并且将在文件中的每一行上尝试执行
s
命令

行号0可以在地址规范中使用,如
0、/regexp/
,这样sed也会尝试在第一个输入行中匹配regexp。换言之,<代码> 0,/ReXPp/<代码>类似于代码> 1,/ReGeXP/<代码>,除了如果ADDR2匹配输入的第一行,<代码> 0,/ReGeXP/</代码>窗体将考虑它结束范围,而<代码> 1,/regexp/表单将匹配其范围的开头,从而使范围一直延伸到正则表达式的第二个匹配项

请注意,这是0地址唯一有意义的地方;没有第0行,以任何其他方式指定0地址的命令将给出错误

因此,在
0、/test/s/#test/g
中,地址部分
0、/test/
仅在与
/test/
匹配的第一行上运行
s
命令,即使它是第一行

空正则表达式“//”重复上一次正则表达式匹配(如果将空正则表达式传递给s命令,则相同的情况也会发生)

因此,
0,/test/s/#test/g
0,/test/s/test/#test/g
是一样的,因为空正则表达式与地址部分中使用的正则表达式相匹配,但可以忽略它,因为两次写入同一个正则表达式只会降低整个命令的可读性

总之:

  • s/test/#test/g
    在包含
    test
  • 0,/test/s/#test/g
    仅在包含
    test

对于第一个要点:对于第二个要点:正则表达式说:从开始之前(行
0
),直到找到包含
test
的行,对于匹配的每一行,将该行中出现的所有
test
替换为
#test
您建议的替换适用于文件中包含
test
的所有行,而不仅仅是第一行。请在此处尝试:
[addr]X[options]