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

时间:2021-04-21 02:00:28

标签: sed

sed -i "0,/test/s//#test/g" file.txt

我不知道如何解析这个正则表达式。它通过放置#来注释测试,但我的问题是

  • 开头的“0”是什么?
  • “s/test/#test/g”有什么不同?也就是为什么 /s 在中间?

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

让我们把它分解成更小的部分:

https://www.gnu.org/software/sed/manual/sed.html#sed-script-overview

<块引用>

sed 命令遵循以下语法:

[addr]X[options]

X 是单字母 sed 命令。 [addr] 是可选的行地址。如果指定了 [addr],则命令 X 将只在匹配的行上执行。

https://www.gnu.org/software/sed/manual/sed.html#Range-Addresses

<块引用>

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

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

https://www.gnu.org/software/sed/manual/sed.html#index-addr1_002c_002bN

<块引用>

行号 0 可用于 0,/regexp/ 等地址规范,以便 sed 也将尝试匹配第一个输入行中的正则表达式。换句话说,0,/regexp/ 类似于 1,/regexp/,除了如果 addr2 匹配输入的第一行,0,/regexp/ 表单会认为它结束了范围,而 {{1}表单将匹配其范围的开头,从而使范围跨越正则表达式的第二次出现。

请注意,这是 0 地址唯一有意义的地方;没有第 0 行,以任何其他方式赋予 0 地址的命令都会出错。

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

https://www.gnu.org/software/sed/manual/sed.html#index-empty-regular-expression

<块引用>

空正则表达式 ‘//’ 重复最后一个正则表达式匹配(如果将空正则表达式传递给 s 命令,同样如此)。

所以 /test/0,/test/s//#test/g 相同,因为空的正则表达式与地址部分中使用的正则表达式匹配 - 但它可以被省略,因为两次写入相同的正则表达式只会使整个命令可读性较差。

总结:

  • 0,/test/s/test/#test/g 对包含 s/test/#test/g 的文件中的每一行进行替换
  • test 仅在包含 0,/test/s//#test/g
  • 的文件的第一行进行替换