在awk
腳本中,我嘗試使用“(”作為字段分隔符號。但是,除非我用雙反斜杠轉義括號,如下所示:
BEGIN {FS=" \\("}
這是行不通的。
如果我使用FS=" \("
我得到
awk: prog:2: warning: escape sequence `\(' treated as plain `('
awk: prog:2: fatal: :, [., or [=: / (/
輸出,如果我根本不轉義括號,我只會得到
awk: prog:2: fatal: :, [., or [=: / (/
訊息.
您能解釋一下這種行為嗎?
答案1
若要使用␣(
(空格+括號) 作為 中的欄位分隔符awk
,請使用"␣\\\("
:
$ echo "a (b (c" | awk -F " \\\(" '{ print $1; print $2; print $3 }'
a
b
c
或者,使用單引號和兩個反斜線:
$ echo "a (b (c" | awk -F ' \\(' '{ print $1; print $2; print $3 }'
a
b
c
這樣做的原因是␣(
(單括號和前導空格)是格式錯誤的正規表示式。左括號開啟一個永遠不會關閉的分組。這就是為什麼需要轉義它。
原因是(
(單括號沒有前導空格)的作用是,當FS
是單一字元時,它不會被視為正規表示式。
答案2
我在尋找類似問題的解決方案時發現了這個線程 - 使用␣
OR(
作為 awk 的字段分隔符。這並沒有完全回答這個問題,但讓我談談我的解決方案:
如果您希望組合␣(
作為一個單元來分隔 awk 中的文件,請執行以下操作awk -F '( \\()' ...
:
$ echo "This (maybe) is a test()" | awk -F '( \\()' '{print $1 "\n" $2 "\n" $3 "\n" $4 "\n" $5 "\n" $6 "\n" $7; print "Number of Fields: " NF}'
This
maybe) is a test()
Number of Fields: 2
如果您正在尋找我的類似問題的解決方案 - 或者␣
,(
請執行以下操作awk -F '( |\\()' ...
:
$ echo "This (maybe) is a test()" | awk -F '( |\\()' '{print $1 "\n" $2 "\n" $3 "\n" $4 "\n" $5 "\n" $6 "\n" $7; print "Number of Fields: " NF}'
This
maybe)
is
a
test
)
Number of Fields: 7