注释掉文件中两个不同模式之间的行
Posted
技术标签:
【中文标题】注释掉文件中两个不同模式之间的行【英文标题】:Comment out lines between two different patterns within a file 【发布时间】:2022-01-08 02:56:41 【问题描述】:我想在文件中每一行的开头插入一个“#”。但仅限于部分之间的那些行:
################## 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=0flag' myinputfile | sed 's/^/#/'
提前感谢您帮助我。
P. S. 因为我是新来的:如果有人有更好的标题/标签的想法,请告诉我,我会改变它。
【问题讨论】:
如果“pattern 1”行存在但“pattern 2”行不存在,应该怎么办?直到文件末尾的行应该被注释掉还是没有被注释掉的行或其他什么? 两种模式始终存在。两种解决方案都可以完美运行。谢谢你的回答。 【参考方案1】:这可能是你想要的:
$ awk '/PATTERN #2/f=0 f$0="#" $0 /PATTERN #1/f=1 1' file
################## PATTERN #1 ##############
#blah 1243234
#blah asdfsyxfvb
#blah asdfasdfg
################## PATTERN #2 ##############
显然将“模式”分隔符调整为您想要的任何内容。
【讨论】:
【参考方案2】:假设第二种模式始终存在,sed
单线可能会完成这项工作:
sed '/PATTERN #1/,/PATTERN #2/s/^/#/' file
【讨论】:
【参考方案3】:您的代码可能会被重新设计以执行您想要的操作。让file.txt
内容成为
################## PATTERN #1 ##############
blah 1243234
blah asdfsyxfvb
blah asdfasdfg
################## PATTERN #2 ##############
然后
awk '/################## PATTERN #1/flag=1;print;next/################## PATTERN #2/flag=0;print;nextprint (flag?"#":"") $0' file.txt
输出
################## PATTERN #1 ##############
#blah 1243234
#blah asdfsyxfvb
#blah asdfasdfg
################## PATTERN #2 ##############
解释:PATTERN #1
的行设置标志为 0,打印行,转到下一行,PATTERN #2
的行设置标志为 1,打印行,转到下一行,如果标志为每隔一行true (1) 然后在行前添加#
并打印,如果标志为 false (0),则在行前添加空字符串(即不要更改)并打印。我使用三元运算符(condition?
valueiftrue:
valueiffalse)来选择适合标记值的字符串
(在 gawk 4.2.1 中测试)
【讨论】:
【参考方案4】:这可能对你有用(GNU sed):
sed '/PATTERN #1/:a;N;/PATTERN #2/!ba;s/^[^#]\?/#&/mg' file
收集PATTERN #1
和PATTERN #2
之间的行,并在没有它们的行前面插入#
。
注意这只会在两种模式都存在的情况下更新文件。
要修改PATTERN #1
和PATTERN #2
之间的最少行,即PATTERN #1
在PATTERN #2
之前再次出现,PATTERN #1
第一次出现的行将不被注释,请使用:
sed '/PATTERN #1/:a;N;/\n.*PATTERN #1/h;s/\(.*\)\n.*/\1/p;g;s/.*\n//;ba
/PATTERN #2/!ba;s/^[^#]\?/#&/mg' file
【讨论】:
以上是关于注释掉文件中两个不同模式之间的行的主要内容,如果未能解决你的问题,请参考以下文章