【问题标题】:How can I print the first line and the pattern of a paragraph using sed or awk如何使用 sed 或 awk 打印第一行和段落的模式
【发布时间】:2016-07-01 03:55:04
【问题描述】:

我想在段落中搜索以 CREATE NEW 开头并以“;”结尾的模式如果模式匹配,则打印段落的第一行和包含模式的行。例如,如果我有以下文件并且我正在寻找以 FROM 开头的行

CREATE NEW paragraph num 1  
FROM file1 
FROM file2 
USING file3 
;
CREATE NEW paragraph num 2 
FROM file2
FROM file6
FROM file5
USING file4
;

结果会是这样的:

CREATE NEW paragraph num 1 ;FROM file1 ;FROM file2
CREATE NEW paragraph num 2 ;FROM file2 ;FROM file6 ;FROM file5

我设法使用以下问题how can I find a matching pattern between two words using sed or awk 的答案打印了第一行,但我不知道如何打印包含该模式的行

【问题讨论】:

    标签: bash awk sed


    【解决方案1】:

    使用这个 awk 命令:

    awk 'p!="" && $0==";"{print p} p!="" && /^FROM /{p = p "; " $0} /^CREATE NEW /{p=$0}' file
    CREATE NEW paragraph num 1 ; FROM file1 ; FROM file2
    CREATE NEW paragraph num 2 ; FROM file2; FROM file6; FROM file5
    

    【讨论】:

      【解决方案2】:

      这样的东西应该可以工作

      awk '/CREATE NEW/,/;/ {
      if($1=="CREATE") 
          printf("\n%s ;",$0);
      else if($1=="FROM")
          printf("%s ;",$0);
                  }' fileToSearch
      

      【讨论】:

        【解决方案3】:

        您可以使用 awk 匹配模式并打印匹配的模式和行号 如下

        BEGIN{
          line_num = 0;
          print "LineNo : Matched Pattern"
        }
        { 
          line = $0
          line_num++;
          if(line ~ /^CREATE NEW / || $NF==";" || line ~/^FROM /)
            print line_num," : " line
        }
        END
        {
        }
        

        【讨论】:

          【解决方案4】:

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

          ed -nr '/CREATE NEW/,/^;/{/^CREATE NEW/h;/^FROM/H;/^;/!d;g;s/\s*\n/ ;/gp}' file
          

          这会收集以CREATE NEW 开头并包含以FROM 开头的行,并将前面的空格和换行符替换为;。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-07-28
            • 1970-01-01
            • 1970-01-01
            • 2020-08-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多