!
たとえば、フィールド区切り文字として使用すると、awk -F!
エラーメッセージが表示されますbash: !: event not found
。なぜ?受け入れていますawk -F"\!"
。バッシュバージョン3.2.25
答え1
!
Bash のトリガー文字です。歴史的拡張。この機能が有効になると、!foo
コマンドラインからこのような内容が拡張されますfoo
。または、対応するコマンドラインがない場合、シェルは以下のようにエラーを表示します。
しかし、単語の最後の文字では何もしてはいけません。これは実際に私が試したすべての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
その仕事をする人ではありません。これが殻です。!
シェルの特殊文字です。
何をすべきか
常にあなたの主張を引用してください。例えば
awk -F'!'