2012-03-21 110 views
2

输入文件text.txt:如何在awk中匹配新行?

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() 
{ 
} 

但我希望用换行同时匹配功能。这个怎么做?

+0

什么版本的AWK您使用的是? – 2012-03-21 13:27:24

回答

2

你可以试试这个:如果你想验证是否有什么后

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

的(),你可以这样做:

$为1〜/ [AZ] +()$/{打印“功能:” $ 1;}

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

+0

我读过'RS =“”'和'RS =“\ n \ n +”'是一样的,但它们不像上面提到的那样。但为什么.. – egor7 2012-03-22 09:42:03

2

既然你已经在使用 “\ 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() 
+0

我需要匹配的表达式_with_新行'\ N'。在你的例子中,在正则表达式的末尾没有'\ n'。 – egor7 2012-03-21 14:24:47

+1

您正在使用换行符作为字段分隔符。你为什么不想利用这一点? – 2012-03-21 15:08:11

2

这可能会为你工作(GNU awk):

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

我需要匹配表达式_with_新行'\ n'。在你的例子中,在正则表达式的末尾没有'\ n'。 – egor7 2012-03-21 14:25:53

+0

糟糕!忘了换行符!解决方案修正 – potong 2012-03-21 14:31:36

0

不知道您期望的输出是什么。

为了在awk中处理FS,你需要生成一个如$ 1 = $ 1的虚拟命令。没有它没有提交分析完成。

因此,如果你希望结果是这样的:

foo() { } 
buz() { } 

只需键入:

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

RS =“”比RS ='\ n \ n'足够了 – mug896 2017-01-26 19:49:43