脚本中使用的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_DEBUG 如 ENABLE_DEBUG = YES
但不知道的意思
0,/^ENABLE_DEBUG.*/
Run Code Online (Sandbox Code Playgroud)
有人可以帮帮我吗?
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)
考虑这个测试文件:
$ 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.