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

时间:2015-08-07 04:31:33

标签: bash sed

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

sed -i "0,/^ENABLE_DEBUG.*/s/^ENABLE_DEBUG.*/ENABLE_DEBUG = YES/" MakeConfig

我知道

s/^ENABLE_DEBUG.*/ENABLE_DEBUG = YES/

是替换行前缀

ENABLE_DEBUGENABLE_DEBUG = YES

但不知道

的含义
0,/^ENABLE_DEBUG.*/

任何人都可以帮助我?

1 个答案:

答案 0 :(得分:6)

0,/^ENABLE_DEBUG.*/表示替换只会发生在从开头0到匹配/^ENABLE_DEBUG.*/的第一行的行上。即使匹配/^ENABLE_DEBUG.*/

,也不会对后续行进行替换

范围的其他示例

这将仅替换第2至5行:

sed '2,5 s/old/new/'

这将从第2行替换为包含something后的第一行:

sed '2,/something/ s/old/new/'

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

sed '/something/,$ s/old/new/'

POSIX与GNU范围:行“0”

的含义

考虑这个测试文件:

$ cat test.txt
one
two
one
three

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

$ sed '1,/one/ s/one/Hello/' test.txt
Hello
two
Hello
three

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

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

$ sed '0,/one/ s/one/Hello/' test.txt
Hello
two
one
three

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