如何使用sed注释掉文件中的多行

如何使用sed注释掉文件中的多行

在一个文件中我有以下几行

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 sedthat 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\)搜索xxxyyyzzz,捕获它们,并替换#和 捕获的模式#\1

相关内容