!
たとえば、フィールド区切りとして使用すると、awk -F!
エラー メッセージが表示されますbash: !: event not found
。なぜでしょうか。受け入れていますawk -F"\!"
。Bash バージョン 3.2.25
答え1
!
バッシュのトリガーキャラクターです歴史の拡大有効にすると、!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'!'