sed中"0,/ xxx"的含义是什么?

ori*_*lin 2 bash sed

脚本中使用的sed命令如下:

sed -i "0,/^ENABLE_DEBUG.*/s/^ENABLE_DEBUG.*/ENABLE_DEBUG = YES/" MakeConfig
Run Code Online (Sandbox Code Playgroud)

我知道

s/^ENABLE_DEBUG.*/ENABLE_DEBUG = YES/
Run Code Online (Sandbox Code Playgroud)

是替换行前缀

ENABLE_DEBUGENABLE_DEBUG = YES

但不知道的意思

0,/^ENABLE_DEBUG.*/
Run Code Online (Sandbox Code Playgroud)

有人可以帮帮我吗?

Joh*_*024 7

0,/^ENABLE_DEBUG.*/意味着替换只发生在从开头0到匹配的第一行的行上/^ENABLE_DEBUG.*/.即使它们匹配,也不会对后续行进行替换/^ENABLE_DEBUG.*/

范围的其他示例

这将仅替换第2行到第5行:

sed '2,5 s/old/new/'
Run Code Online (Sandbox Code Playgroud)

这将从第2行替换为第2行,其中包括something:

sed '2,/something/ s/old/new/'
Run Code Online (Sandbox Code Playgroud)

这将从包含的第一行替换something到文件末尾:

sed '/something/,$ s/old/new/'
Run Code Online (Sandbox Code Playgroud)

POSIX与GNU范围:行"0"的含义

考虑这个测试文件:

$ cat test.txt
one
two
one
three
Run Code Online (Sandbox Code Playgroud)

现在,让我们在范围内应用sed 1,/one/:

$ sed '1,/one/ s/one/Hello/' test.txt
Hello
two
Hello
three
Run Code Online (Sandbox Code Playgroud)

范围从第1行开始,以第1行匹配的第一行结束one.因此,上面进行了两次替换.

假设我们只想要第一个one被替换.对于POSIX sed,这不能用范围来完成.正如NeronLeVelu指出的那样,GNU sed为这种情况提供了一个扩展:它允许我们指定范围为0,/one/.此范围以one文件中第一次出现的结尾:

$ sed '0,/one/ s/one/Hello/' test.txt
Hello
two
one
three
Run Code Online (Sandbox Code Playgroud)

因此,范围0,/^ENABLE_DEBUG/以第一行结束,ENABLE_DEBUG即使该行是第一行,也以该行开头.这需要GNU sed.

  • 仅限 GNU sed,POSIX sed 无法识别地址“0”。GNU 进化允许在文件的第一行出现第二个地址(在这种情况下为正则表达式模式),而 posix 只允许从第二行出现。 (2认同)