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

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 #1PATTERN #2 之间的行,并在没有它们的行前面插入#

注意这只会在两种模式都存在的情况下更新文件。


要修改PATTERN #1PATTERN #2 之间的最少行,即PATTERN #1PATTERN #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

【讨论】:

以上是关于注释掉文件中两个不同模式之间的行的主要内容,如果未能解决你的问题,请参考以下文章

如何选择可能使用 awk/sed 多次出现的两个标记模式之间的行

linux中查看文件时忽略注释掉的行

mysql比较两个表不同的行

在两个xlsx文件之间查找相同的行

Bash删除包含“/”的两个模式之间的行[重复]

在 Visual Studio 中注释掉找到的行