【问题标题】: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=0}flag' myinputfile | sed 's/^/#/'

提前感谢您帮助我。

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

【问题讨论】:

  • 如果“pattern 1”行存在但“pattern 2”行不存在,应该怎么办?直到文件末尾的行应该被注释掉还是没有被注释掉的行或其他什么?
  • 两种模式始终存在。两种解决方案都可以完美运行。谢谢你的回答。

标签: bash shell awk sed


【解决方案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;next}{print (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
        

        【讨论】:

          猜你喜欢
          • 2013-01-08
          • 1970-01-01
          • 2020-01-06
          • 2016-11-03
          • 2021-03-02
          • 2023-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多