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