我正在尝试使用sed在配置文件中注释掉一行并出现问题。
我正在使用sed –i '/GV()/s/^/#/' filename
并且它有效,但它会在文件中注释掉所有GV()
。我只想评论第一次出现。
我知道如何用sed做到这一点?
由于
答案 0 :(得分:1)
使用GNU sed:
sed -i '/GV()/{s/.*/#&/;:A;n;bA}' file
答案 1 :(得分:1)
sed -e '1,/GV()/s/GV()/#GV()/' filename
答案 2 :(得分:0)
对于这个问题,awk是一个自然的工具。考虑一下这个测试文件:
$ cat file
one
GV()
GV()
然后,使用awk:
$ awk '/GV()/ && !f {print "#"$0; f=1; next} 1' file
one
#GV()
GV()
只有在之前没有看到这样的行时,上面的注释才会显示包含GV()
的行。变量f
会跟踪之前是否见过GV()
。
/GV()/ && !f {print "#"$0; f=1; next}
/GV()/ && !f
是一个条件:大括号{...}
后面的语句只有在条件为真时才会执行。只有当行包含GV()
并且f
为假时才是真的,这意味着我们之前没有看到过这样的行。在这种情况下,我们(a)注释掉行print "#"$0
,(b)将f
设置为true:f=1
,以及(c)跳过其余命令并重新开始在next
行。
1
这是awk用于打印线条的神秘简写。