該怎麼辦

該怎麼辦

當我用作!字段分隔符號時,例如awk -F!它給出錯誤訊息bash: !: event not found。為什麼?它正在接受awk -F"\!"。 bash 版本 3.2.25

答案1

!是 Bash 的觸發字符歷史擴展。如果啟用該功能,則!foo命令列上的類似內容將擴展為以foo.或者,如果沒有這樣的命令列,shell 會給出錯誤,如下所示。

但它不應該作為單字的最後一個字元執行任何操作。這實際上在我嘗試過的所有 Bash 版本中都按照您的預期工作:

$ echo 'aa!bb' | awk -F! '{print $1}' 
aa

在更新的版本中,!也不應該在結束雙引號之前執行任何操作,因此-F"!"在更高版本中有效,但在 3.2 中無效。

反斜線或單引號可以用來轉義它,即既不擴展\!foo也不'!foo'擴展。當然,您也可以通過完全禁用歷史擴展來阻止它,使用set +H.

如果加上雙引號就更奇怪了。在其中,反斜線禁用歷史擴展,但反斜線本身保留在原處:

$ printf '%s\n' "\!foo"
\!foo

在這種情況下,awk -F"\!"這是有效的,因為 awk 本身刪除了反斜線。

答案2

並不是awk那個人在做這件事。這是外殼。!是 shell 中的特殊字元。

該怎麼辦

總是引用你的論點。例如

awk -F'!'

相關內容