在 awk 中使用 ' (' (空格後面跟著括號)作為字段分隔符

在 awk 中使用 ' (' (空格後面跟著括號)作為字段分隔符

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

相關內容