在一个文件中我有以下几行
foo
bar
xxx
yyy
zzz
我需要注释掉 xxx、yyy、zzz 行。所以我运行以下命令:
sed -e '/xxx/ s/^#*/#/' -i file
sed -e '/yyy/ s/^#*/#/' -i file
sed -e '/zzz/ s/^#*/#/' -i file
出去
foo
bar
#xxx
#yyy
#zzz
我怎样才能在循环中执行此操作(检查我感兴趣的所有行是否都已注释,如果没有,请注释它们)?
谢谢
PD:这个命令如果我知道行号,但我不知道,因为它可能会有所不同,那么它会很有用。
sed -e '2s/^/#/' -e '5s/^/#/' -e '7s/^/#/' file
PD:我也不能使用 EOF,因为每一行都是一个正则表达式
答案1
使用以下示例数据file
:
foo
bar
xxx
yyy
zzz
foo
bar
#xxx
#yyy
#zzz
使用 a sed
that has-E
来使用扩展正则表达式:
$ sed -E 's/^(xxx|yyy|zzz)$/#&/' file
foo
bar
#xxx
#yyy
#zzz
foo
bar
#xxx
#yyy
#zzz
和awk
:
$ awk '/^(xxx|yyy|zzz)$/ { $0 = "#" $0 }; 1' file
foo
bar
#xxx
#yyy
#zzz
foo
bar
#xxx
#yyy
#zzz
使用标准sed
:
$ sed -e '/^xxx$/bc' -e '/^yyy$/bc' -e '/^zzz$/bc' -e b -e ':c' -e 's/./#&/' file
foo
bar
#xxx
#yyy
#zzz
foo
bar
#xxx
#yyy
#zzz
答案2
鉴于此示例文本:
foo
bar
xxx
yyy
zzz
foo
bar
#xxx
#yyy
#zzz
您可以使用此命令:
$ sed 's/^\(xxx\|yyy\|zzz\)$/#\1/' file
foo
bar
#xxx
#yyy
#zzz
foo
bar
#xxx
#yyy
#zzz
^[^#]*
解析不以 开头的行#
。\(xxx\|yyy\|zzz\)
搜索xxx
、yyy
或zzz
,捕获它们,并替换#
和 捕获的模式#\1
。