如何用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