如何使用sed或awk打印第一行和段落的模式

时间:2016-03-15 15:42:02

标签: bash awk sed

我想在段落中搜索以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的答案打印第一行但我不知道如何打印包含该模式的行

4 个答案:

答案 0 :(得分:2)

使用此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

答案 1 :(得分:1)

这样的事情应该有效

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

答案 2 :(得分:1)

这可能适合你(GNU sed):

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

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

答案 3 :(得分:0)

您可以使用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
{
}