注释掉文件中两个不同模式之间的行
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 #1
和 PATTERN #2
之间的行,并在没有它们的行的前面插入 #
。
N.B。这将仅在 两个 模式都存在的情况下更新文件。
修改 PATTERN #1
和 PATTERN #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
我想在文件中每一行的开头插入一个“#”。但仅限于部分之间的那些行:
################## 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 #1
和 PATTERN #2
之间的行,并在没有它们的行的前面插入 #
。
N.B。这将仅在 两个 模式都存在的情况下更新文件。
修改 PATTERN #1
和 PATTERN #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