为什么awk不接受!作为字段分隔符?

Kal*_*hoj 1 awk

当我!用作字段分隔符时,例如awk -F!它会给出错误消息bash: !: event not found。为什么?它正在接受awk -F"\!"。Bash 版本 3.2.25

ilk*_*chu 12

!是 Bash历史扩展的触发字符。如果启用,则类似于!foo命令行上的内容将扩展为以foo. 或者如果没有这样的命令行,shell 会给出一个错误,就像这里。

但是,它不应该作为单词的最后一个字符做任何事情。这实际上在我尝试过的所有 Bash 版本中都按您的意图工作:

$ echo 'aa!bb' | awk -F! '{print $1}' 
aa
Run Code Online (Sandbox Code Playgroud)

在较新的版本中,!在结束双引号之前也不应该做任何事情,因此-F"!"在更高版本中有效,但在 3.2 中无效。

反斜杠或单引号将用于转义它,即既\!foo不会也'!foo'不会扩展。当然,您也可以通过完全禁用历史扩展来阻止它,使用set +H.

用双引号更奇怪。在其中,反斜杠禁用历史扩展,但反斜杠本身保留原位:

$ printf '%s\n' "\!foo"
\!foo
Run Code Online (Sandbox Code Playgroud)

在这种情况下,awk -F"\!"因为 awk 本身删除了反斜杠。


ctr*_*lor 10

不是awk这样做的。它是外壳。!是 shell 中的一个特殊字符。

该怎么办

总是引用你的论点。例如

awk -F'!'
Run Code Online (Sandbox Code Playgroud)

  • @Kalpesh 这不是答案中写的内容。再看 - 在使用的​​引号 (4认同)