Awk
如何將“[}”或“[)”設置為 gawk 的 FS?
我正在使用 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 Single
printf
在awk
. 您應該添加一些參數,例如要列印的格式化字元串和變數。如其他答案中所述,如果您想列印整行使用'1'
而不是'{printf}'
由於任何用作輸入欄位分隔符 (
FS
) 的多字元串都將被解釋為正則表達式,因此該字元串必須是有效的正則表達式。awk -F '\\[}' '{ print }'
不需要對 做任何特殊處理
}
,但[
必須將首字母轉義才能匹配為文字左方括號。您需要兩個反斜杠,因為使用單個反斜杠(如\[}
)會轉義方括號並將分隔符表達式設置為[}
,這是一個無效的正則表達式。您也可以使用[[]
代替\\[
,它使用括號表達式匹配文字[
,但不會節省打字時間並且可能難以閱讀。我也冒昧地修復了程式碼。該
printf
語句將格式字元串作為參數,然後輸出一個或多個表達式。由於您不提供格式字元串,因此您會收到錯誤消息。一個較短的變體是使用
1
(或任何非空、非零字元串)。這將充當始終正確的*測試。*真正的測試將觸發預設操作,即列印目前記錄(行)。awk -F '\\[}' '1'
…雖然除了輸出每一行輸入之外,這不會做任何令人興奮的事情。對分隔符值的更有用的測試是
awk -F '\\[}' '{ print $1 }'
…列印每個輸入記錄的第一個欄位,例如,
{]ABC
如果輸入是{]ABC[}{]123[}
.