2012-03-21 104 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