【问题标题】:sed or awk: delete/comment n lines following a pattern before 3 linessed 或 awk:删除/注释 3 行之前的模式后面的 n 行
【发布时间】:2021-01-30 14:07:17
【问题描述】:

删除/注释模式前的 3 行(包括带模式的行):

我如何通过 sed 命令实现它

参考: sed or awk: delete n lines following a pattern

上面的参考博客有助于在模式匹配后实现这一点,但我需要在匹配前知道


define host{
use                             xxx;
host_name                       pattern;
alias                           yyy;
address                         zzz;
}

例如,下面的 sed 命令将在模式匹配后注释“#”

sed -e '/pattern/,+3 s/^/#/' file.cfg

define host{
use                             xxx;
#host_name                       pattern;
#alias                           yyy;
#address                         zzz;
#}

像这样我该如何为之前的模式做到这一点?

谁能帮我解决这个问题

【问题讨论】:

    标签: sed


    【解决方案1】:

    如果允许 tac: tac|sed -e '/pattern/,+3 s/^/#/'|tac

    如果不允许使用 tac: sed -e '1!G;h;$!d'|sed -e '/pattern/,+3 s/^/#/'|sed -e '1!G;h;$!d' (来源:http://sed.sourceforge.net/sed1line.txt

    【讨论】:

      【解决方案2】:

      反转文件,注释之后的3行,然后重新反转文件。

      tac file | sed '/pattern/ {s/^/#/; N; N; s/\n/&#/g;}' | tac
      
      #define host{
      #use                             xxx;
      #host_name                       pattern;
      alias                           yyy;
      address                         zzz;
      }
      

      虽然我认为 awk 更容易阅读:

      tac file | awk '/pattern/ {c=3} c-- > 0 {$0 = "#" $0} 1' | tac
      

      【讨论】:

        【解决方案3】:

        这可能对你有用(GNU sed):

        sed ':a;N;s/\n/&/3;Ta;/pattern[^\n]*$/s/^/#/mg;P;D' file
        

        在模式空间中收集 4 行,如果最后一行包含 pattern,则在模式空间中每行的开头插入 #

        要删除这 4 行,请使用:

        sed ':a;N;s/\n/&/3;Ta;/pattern[^\n]*$/d;P;D' file
        

        要删除 pattern 之前的 3 行,但不删除包含 pattern 的行,请使用:

        sed ':a;N;s/\n/&/3;Ta;/pattern[^\n]*$/s/.*\n//;P;D'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-24
          • 1970-01-01
          • 2019-08-31
          • 2012-08-01
          • 2011-09-16
          • 2013-10-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多