你好我想下面的字符串匹配無濟於事在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]<--
任何指針我哪裏錯了?
你好我想下面的字符串匹配無濟於事在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]<--
任何指針我哪裏錯了?
正則表達式/\[.*\]/
匹配整個輸入,因爲.*
匹配輸入內部的][
以及匹配字母。
你可能分裂的「]」字符區域,而不是,然後把它再次回到輸出:
echo '[xxAA][xxBxx][C]' | awk -F ']' '{ for (i = 1; i <= NF; i++) if ($i != "") printf "-->%s]<--\n", $i }'
可以在字段分隔符使用正則表達式。我們將字符類中的[
和]
附在字符類中,以將其視爲文字。兩者之間由邏輯OR
邏輯|
分隔。由於我們將它們作爲字段分隔符來對待,我們只是遍歷偶數字段的數字來獲取輸出。
$ echo '[xxAA][xxBxx][C]' | awk -v FS="[]]|[[]" '{ for (i=2;i<=NF;i+=2) print $i }'
xxAA
xxBxx
C
這是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<--
我會誠實的。即使我有GNU'awk' 4.1,並且已經使用了一段時間'FPAT'和'patsplit'是兩個未被充分利用的特性。 – 2014-09-23 23:38:37
是的,我還沒有找到使用patsplit()我自己,但FPAT是有用的,尤其是對於CSV解析。 – 2014-09-23 23:40:06
確實如此,使用'FPAT'解析引用的CSV是有幫助的。我只是使用'Text :: ParseWords'核心模塊和'perl',主要是在RHEL 6機器上工作的機器仍然使用GNU'awk' 3.x。 – 2014-09-23 23:44:02
+1,我不知道awk接受一個模式作爲字段分隔符,並且方括號不需要在字符類中轉義。我將在這篇文章中添加awk:http://stackoverflow.com/questions/17845014/what-does-the-regex-mean – 2014-09-23 23:18:00
我很驚訝你不能寫這樣的東西:'] | \ ['或'\] | \ ['。但似乎你可以寫:'[] []' – 2014-09-23 23:29:35
感謝@CasimiretHippolyte爲投票和鏈接的帖子。這是非常豐富的。是的,理想情況下應該寫'[] []'。我只是藉此機會建議在字段分隔符中使用邏輯「或」運算符。 – 2014-09-23 23:32:28