我試圖解析由「|」分隔的字段的行和空間填充。我認爲這將是如此簡單:awk:與正則表達式分割
$ echo "1 a | 2 b | 3 c " | awk -F' *| *' '{ print "-->" $2 "<--" }'
不過,我得到的是
-->a<--
,而不是預期
-->2 b<--
我使用了GNU AWK 4.0.1 。
我試圖解析由「|」分隔的字段的行和空間填充。我認爲這將是如此簡單:awk:與正則表達式分割
$ echo "1 a | 2 b | 3 c " | awk -F' *| *' '{ print "-->" $2 "<--" }'
不過,我得到的是
-->a<--
,而不是預期
-->2 b<--
我使用了GNU AWK 4.0.1 。
。因此你得到的輸出是正確的。如果您需要將|
作爲分隔符,請將其轉義。
$ 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<--
echo "1 a | 2 b | 3 c " | awk -F '|' '{print $2}' | tr -d ' '
當您使用' *| *'
,awk
其解釋爲space
ORspace
生產 「2 B」 對我來說
不,它沒有給出「2 b」,它給出了'2 b',之前和之後的空間,這是OP不喜歡的。 – Jotne
修正了它。不需要轉義序列。 –
謝謝@devnull。 ':)' –
不客氣':-)' – devnull
根據你的shell,你可能會發現你需要3個反斜槓:'-F'* \\\ | *'' - 與角色班級一起去的好建議。 –