2014-09-23 70 views
1

你好我想下面的字符串匹配無濟於事在AWK使用正則表達式似乎找不到模式

echo '[xxAA][xxBxx][C]' | awk -F '/\[.*\]/' '{ for (i = 1; i <= NF; i++) printf "-->%s<--\n", $i }' 

我基本上希望有每個字段是一個封閉的支架,使得

場1 = xxAA 字段2 = xxBxx 字段3 = C

但一直收到以下結果

-->[xxAA][xxBxx][C]<-- 

任何指針我哪裏錯了?

回答

1

正則表達式/\[.*\]/匹配整個輸入,因爲.*匹配輸入內部的][以及匹配字母。

你可能分裂的「]」字符區域,而不是,然後把它再次回到輸出:

echo '[xxAA][xxBxx][C]' | awk -F ']' '{ for (i = 1; i <= NF; i++) if ($i != "") printf "-->%s]<--\n", $i }' 
2

可以在字段分隔符使用正則表達式。我們將字符類中的[]附在字符類中,以將其視爲文字。兩者之間由邏輯OR邏輯|分隔。由於我們將它們作爲字段分隔符來對待,我們只是遍歷偶數字段的數字來獲取輸出。

$ echo '[xxAA][xxBxx][C]' | awk -v FS="[]]|[[]" '{ for (i=2;i<=NF;i+=2) print $i }' 
xxAA 
xxBxx 
C 
+1

+1,我不知道awk接受一個模式作爲字段分隔符,並且方括號不需要在字符類中轉義。我將在這篇文章中添加awk:http://stackoverflow.com/questions/17845014/what-does-the-regex-mean – 2014-09-23 23:18:00

+1

我很驚訝你不能寫這樣的東西:'] | \ ['或'\] | \ ['。但似乎你可以寫:'[] []' – 2014-09-23 23:29:35

+1

感謝@CasimiretHippolyte爲投票和鏈接的帖子。這是非常豐富的。是的,理想情況下應該寫'[] []'。我只是藉此機會建議在字段分隔符中使用邏輯「或」運算符。 – 2014-09-23 23:32:28

1

這是GNU awk的FPAT變量的作業,它可以讓你指定的字段的模式,而不是場分離的模式:

$ echo '[xxAA][xxBxx][C]' | awk -v FPAT='[^][]+' '{ for (i = 1; i <= NF; i++) printf "-->%s<--\n", $i }' 
-->xxAA<-- 
-->xxBxx<-- 
-->C<-- 

與其他awks我會使用:

$ echo '[xxAA][xxBxx][C]' | awk -F'\\]\\[' '{ gsub(/^\[|\]$/,""); for (i = 1; i <= NF; i++) printf "-->%s<--\n", $i }' 
-->xxAA<-- 
-->xxBxx<-- 
-->C<-- 
+1

我會誠實的。即使我有GNU'awk' 4.1,並且已經使用了一段時間'FPAT'和'patsplit'是兩個未被充分利用的特性。 – 2014-09-23 23:38:37

+1

是的,我還沒有找到使用patsplit()我自己,但FPAT是有用的,尤其是對於CSV解析。 – 2014-09-23 23:40:06

+0

確實如此,使用'FPAT'解析引用的CSV是有幫助的。我只是使用'Text :: ParseWords'核心模塊和'perl',主要是在RHEL 6機器上工作的機器仍然使用GNU'awk' 3.x。 – 2014-09-23 23:44:02