Awk

如何將“[}”或“[)”設置為 gawk 的 FS?

  • May 8, 2022

我正在使用 GNU Awk 5.0.1,我需要使用[}or[)作為FS. 我不能讓它工作。以下是我嘗試過的。

root@u2004:~# echo test | awk -F '[}' '{printf}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}/
root@u2004:~# echo test | awk -F '[\}' '{printf}'
awk: warning: escape sequence `\}' treated as plain `}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}/
root@u2004:~# echo test | awk -F '[\\}' '{printf}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[\}/
root@u2004:~# echo test | awk -F '[}}' '{printf}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}}/
root@u2004:~# echo test | awk -F "[}" '{printf}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}/
root@u2004:~# echo test | awk -F "[\}" '{printf}'
awk: warning: escape sequence `\}' treated as plain `}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}/
root@u2004:~# echo test | awk -F "[\\}" '{printf}'
awk: warning: escape sequence `\}' treated as plain `}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}/
root@u2004:~# echo test | awk -F "[}}" '{printf}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}}/
root@u2004:~#

我怎樣才能做到這一點?

您可以嘗試這樣的構造:

awk -v FS='\\[\}'  ' {printf}' input_file

它只需要“雙重”轉義[

作為記錄,您可以使用構造的變體,例如:

awk 'BEGIN{ FS="\\[\}"}  ' {printf}' input_file

或者

awk   ' {printf}' FS='\\[\}' input_file

像這樣的構造也可以完成工作:

awk -F '[[]}' '{printf}' input_file

可選分隔符的“列表”僅包含[且必須後跟}

PS Singleprintfawk. 您應該添加一些參數,例如要列印的格式化字元串和變數。如其他答案中所述,如果您想列印整行使用'1'而不是'{printf}'

由於任何用作輸入欄位分隔符 ( FS) 的多字元串都將被解釋為正則表達式,因此該字元串必須是有效的正則表達式。

awk -F '\\[}' '{ print }'

不需要對 做任何特殊處理},但[必須將首字母轉義才能匹配為文字左方括號。您需要兩個反斜杠,因為使用單個反斜杠(如\[})會轉義方括號並將分隔符表達式設置為[},這是一個無效的正則表達式。您也可以使用[[]代替\\[,它使用括號表達式匹配文字[,但不會節省打字時間並且可能難以閱讀。

我也冒昧地修復了程式碼。該printf語句將格式字元串作為參數,然後輸出一個或多個表達式。由於您不提供格式字元串,因此您會收到錯誤消息。

一個較短的變體是使用1(或任何非空、非零字元串)。這將充當始終正確的*測試。*真正的測試將觸發預設操作,即列印目前記錄(行)。

awk -F '\\[}' '1'

…雖然除了輸出每一行輸入之外,這不會做任何令人興奮的事情。對分隔符值的更有用的測試是

awk -F '\\[}' '{ print $1 }'

…列印每個輸入記錄的第一個欄位,例如,{]ABC如果輸入是{]ABC[}{]123[}.

引用自:https://unix.stackexchange.com/questions/701723