何をすべきか

何をすべきか

!たとえば、フィールド区切り文字として使用すると、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'!'

関連情報