注释掉文件中两个不同模式之间的行

Comment out lines between two different patterns within a file

我想在文件中每一行的开头插入一个“#”。但仅限于部分之间的那些行:

################## PATTERN #1 ##############
blah 1243234
blah asdfsyxfvb
blah asdfasdfg
################## PATTERN #2 ##############

-->

################## PATTERN #1 ##############
#blah 1243234
#blah asdfsyxfvb
#blah asdfasdfg
################## PATTERN #2 ##############

以我对awk和sed的有限了解,差不多搞定了。但是我正在努力将输出合并到我的文件中。

awk '/################## PATTERN #1/{flag=1;next}/################## PATTERN #2/{flag=0}flag' myinputfile | sed 's/^/#/'

在此先感谢您的帮助。

P。 S. 因为我是新来的:如果有人有更好的想法 title/tags 请告诉我,我会改变它。

这可能是您想要的:

$ awk '/PATTERN #2/{f=0} f{[=10=]="#" [=10=]} /PATTERN #1/{f=1} 1' file
################## PATTERN #1 ##############
#blah 1243234
#blah asdfsyxfvb
#blah asdfasdfg
################## PATTERN #2 ##############

显然将“模式”分隔符调整为您想要的任何内容。

假设第二个模式总是存在,sed 一行就可以完成工作:

sed '/PATTERN #1/,/PATTERN #2/s/^/#/' file

您的代码可能会被重新编写以执行您想要的操作。让file.txt内容为

################## PATTERN #1 ##############
blah 1243234
blah asdfsyxfvb
blah asdfasdfg
################## PATTERN #2 ##############

然后

awk '/################## PATTERN #1/{flag=1;print;next}/################## PATTERN #2/{flag=0;print;next}{print (flag?"#":"") [=11=]}' file.txt

输出

################## PATTERN #1 ##############
#blah 1243234
#blah asdfsyxfvb
#blah asdfasdfg
################## PATTERN #2 ##############

解释:对于 PATTERN #1 的行,将标志设置为 0,打印行,转到下一行,对于 PATTERN #2 的行,将标志设置为 1,打印行,转到下一行,对于每隔一行,如果标志为真(1),则在行前添加 # 并打印,如果标志为假(0),则在行前添加空字符串(即不要更改)并打印。我使用三元运算符 (condition?valueiftrue:valueiffalse) 来 select string suitable to flag value

(在 gawk 4.2.1 中测试)

这可能适合您 (GNU sed):

sed '/PATTERN #1/{:a;N;/PATTERN #2/!ba;s/^[^#]\?/#&/mg}' file

收集 PATTERN #1PATTERN #2 之间的行,并在没有它们的行的前面插入 #

N.B。这将仅在 两个 模式都存在的情况下更新文件。


修改 PATTERN #1PATTERN #2 之间的最少行,即 PATTERN #1 再次出现在 PATTERN #2 之前,第一次出现的 PATTERN #1 的行将不会被评论,使用:

 sed '/PATTERN #1/{:a;N;/\n.*PATTERN #1/{h;s/\(.*\)\n.*//p;g;s/.*\n//;ba}
      /PATTERN #2/!ba;s/^[^#]\?/#&/mg}' file