Kalpesh Bhoj Asked: 2020-03-11 23:49:38 +0800 CST2020-03-11 23:49:38 +0800 CST 2020-03-11 23:49:38 +0800 CST 为什么awk不接受!作为场分隔符?[复制] 772 例如,当我!用作字段分隔符awk -F!时,它会给出错误消息bash: !: event not found。为什么?它正在接受awk -F"\!"。重击版本 3.2.25 awk 2 个回答 Voted Best Answer ilkkachu 2020-03-12T00:49:28+08:002020-03-12T00:49:28+08:00 !是 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 本身删除了反斜杠。 ctrl-alt-delor 2020-03-11T23:57:19+08:002020-03-11T23:57:19+08:00 不是awk这样做的。它是外壳。!是 shell 中的一个特殊字符。 该怎么办 总是引用你的论点。例如 awk -F'!'
!
是 Bash历史扩展的触发字符。如果启用了该功能,则类似于!foo
命令行的内容会扩展为以 . 开头的最新命令foo
。或者如果没有这样的命令行,shell 会给出一个错误,就像这里一样。但是,它不应该作为单词的最后一个字符做任何事情。这实际上在我尝试的所有版本的 Bash 中都可以正常工作:
在较新的版本中,
!
在结束双引号之前也不应该做任何事情,因此-F"!"
在以后的版本中有效,但在 3.2 中无效。反斜杠或单引号将用于转义它,即既
\!foo
不会也'!foo'
不会扩展。当然,您也可以通过完全禁用历史扩展来阻止它,使用set +H
.使用双引号会更奇怪。在其中,反斜杠禁用历史扩展,但反斜杠本身保留在原位:
在这种情况下
awk -F"\!"
有效,因为 awk 本身删除了反斜杠。不是
awk
这样做的。它是外壳。!
是 shell 中的一个特殊字符。该怎么办
总是引用你的论点。例如