脚本中使用的sed命令如下:
sed -i "0,/^ENABLE_DEBUG.*/s/^ENABLE_DEBUG.*/ENABLE_DEBUG = YES/" MakeConfig
我知道
s/^ENABLE_DEBUG.*/ENABLE_DEBUG = YES/
是替换行前缀
ENABLE_DEBUG
为ENABLE_DEBUG = YES
但不知道
的含义0,/^ENABLE_DEBUG.*/
任何人都可以帮助我?
答案 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/'
考虑这个测试文件:
$ 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。