如何用sed注释掉第一次出现
how to comment out the first occurrence with sed
我正在尝试使用 sed 注释掉配置文件中的一行,但遇到了问题。
我正在使用 sed –i '/GV()/s/^/#/' filename
它有效,但它注释掉了文件中所有出现的 GV()
。我只想注释掉第一次出现的地方。
知道如何使用 sed 做到这一点吗?
谢谢
对于这个问题,awk 是天生的工具。考虑这个测试文件:
$ cat file
one
GV()
GV()
然后,使用 awk:
$ awk '/GV()/ && !f {print "#"[=11=]; f=1; next} 1' file
one
#GV()
GV()
上面注释掉了包含 GV()
的行,前提是之前没有看到这样的行。变量 f
跟踪之前是否见过 GV()
。
工作原理
/GV()/ && !f {print "#"[=15=]; f=1; next}
/GV()/ && !f
是一个条件:大括号 {...}
后面的语句只有在条件为真时才执行。仅当该行包含 GV()
且 f
为假时才为真,这意味着我们之前没有见过这样的行。在这种情况下,我们 (a) 注释掉行 print "#"[=20=]
,(b) 将 f
设置为真:f=1
,以及 (c) 跳过其余命令并重新开始在 next
行。
1
这个 awk 的神秘 shorthand 用于打印行。
使用 GNU sed:
sed -i '/GV()/{s/.*/#&/;:A;n;bA}' file
sed -e '1,/GV()/s/GV()/#GV()/' filename
我正在尝试使用 sed 注释掉配置文件中的一行,但遇到了问题。
我正在使用 sed –i '/GV()/s/^/#/' filename
它有效,但它注释掉了文件中所有出现的 GV()
。我只想注释掉第一次出现的地方。
知道如何使用 sed 做到这一点吗?
谢谢
对于这个问题,awk 是天生的工具。考虑这个测试文件:
$ cat file
one
GV()
GV()
然后,使用 awk:
$ awk '/GV()/ && !f {print "#"[=11=]; f=1; next} 1' file
one
#GV()
GV()
上面注释掉了包含 GV()
的行,前提是之前没有看到这样的行。变量 f
跟踪之前是否见过 GV()
。
工作原理
/GV()/ && !f {print "#"[=15=]; f=1; next}
/GV()/ && !f
是一个条件:大括号{...}
后面的语句只有在条件为真时才执行。仅当该行包含GV()
且f
为假时才为真,这意味着我们之前没有见过这样的行。在这种情况下,我们 (a) 注释掉行print "#"[=20=]
,(b) 将f
设置为真:f=1
,以及 (c) 跳过其余命令并重新开始在next
行。1
这个 awk 的神秘 shorthand 用于打印行。
使用 GNU sed:
sed -i '/GV()/{s/.*/#&/;:A;n;bA}' file
sed -e '1,/GV()/s/GV()/#GV()/' filename