2014-02-25 172 views
1

我試圖解析由「|」分隔的字段的行和空間填充。我認爲這將是如此簡單:awk:與正則表達式分割

$ echo "1 a | 2 b | 3 c " | awk -F' *| *' '{ print "-->" $2 "<--" }' 

不過,我得到的是

-->a<-- 

,而不是預期

-->2 b<-- 

我使用了GNU AWK 4.0.1 。

回答

4

。因此你得到的輸出是正確的。如果您需要將|作爲分隔符,請將其轉義。

$ echo "1 a | 2 b | 3 c " | awk -F' *\\| *' '{ print "-->" $2 "<--" }' 
-->2 b<-- 

注意,你必須轉義兩次,因爲在awk\|被認爲|以及這將再次得到解釋爲邏輯OR

正因爲如此,在字符類[]中逃脫這些特殊字符是非常受歡迎的。

$ echo "1 a | 2 b | 3 c " | awk -F' *[|] *' '{ print "-->" $2 "<--" }' 
-->2 b<-- 
+0

謝謝@devnull。 ':)' –

+0

不客氣':-)' – devnull

+1

根據你的shell,你可能會發現你需要3個反斜槓:'-F'* \\\ | *'' - 與角色班級一起去的好建議。 –

0
echo "1 a | 2 b | 3 c " | awk -F '|' '{print $2}' | tr -d ' ' 

當您使用' *| *'awk其解釋爲spaceORspace生產 「2 B」 對我來說

+0

不,它沒有給出「2 b」,它給出了'2 b',之前和之後的空間,這是OP不喜歡的。 – Jotne

+0

修正了它。不需要轉義序列。 –