如何匹配awk中的新行?

时间:2012-03-21 09:37:27

标签: awk

输入文件text.txt:

foo()
{
}

buz()
{
}

Awk script.awk

BEGIN {
    RS = "\n\n+";
    FS = "\n";
}
/[a-z]+\(\)\n/ {print "FUNCTION: " $1;}
{print "NOT FOUND: " $0;}

运行脚本:

  

awk -f script.awk text.txt

给出:

NOT FOUND: foo()
{
}
NOT FOUND: buz()
{
}

但是我希望将两个函数与换行符匹配。怎么做?

4 个答案:

答案 0 :(得分:4)

由于你已经使用“\ n”作为FS,你可以只对$ 1进行匹配:

awk -v RS='\n\n+' -v FS='\n' '
  $1 ~ /^[a-z]+\(\)$/ {print "FUNCTION: " $1; next}
  {print "NOT FOUND: " $0}
' text.txt

这适用于gawk:

FUNCTION: foo()
FUNCTION: buz()

答案 1 :(得分:3)

这可能适合你(GNU awk):

awk '{if(/^[a-z]+\(\)\n/)print "FUNCTION:"$1; else print "NOT FOUND: "$0}' RS="" file

答案 2 :(得分:2)

你可以试试这个:

BEGIN {
    RS = "";
    FS = "\n";
}
/[a-z]+\(\)/ {print "FUNCTION: " $1;}
!/[a-z]+\(\)/ {print "NOT FOUND: " $0;}

如果你想验证()后面没有任何内容,你可以这样做:

$ 1~ / [a-z] +()$ / {print“FUNCTION:”$ 1;}

我不知道为什么换行不匹配。也许有人会解释它。

答案 3 :(得分:0)

不确定你想要的输出是什么。

为了在awk中处理FS,你需要产生一个像$ 1 = $ 1这样的虚拟命令。没有它,就不会进行归档解析。

所以,如果你期望这样的结果:

foo() { }
buz() { } 

只需输入:

awk  '{$1=$1; print} '  RS='\n\n' FS='\n' OFS=" "