如何解析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]