同僚がビルドツリーを作成し(通過gradle :dependencies > dependencies.txt
)、それを電子メールで送信しました。バージョンを知りたいライブラリを見つけて、以下を実行しました。
grep log4j dependencies.txt
しかし、一致するものが1つもなく、私のシェルは新しいプロンプトを印刷しました。ファイルが長くてgrepを信頼しているので、開いて確認しませんでした。しばらくの間に行った後、ファイルがWindowsコンピュータで作成されたと言われました。それにもかかわらず、grepが機能しないという事実に驚きました。検索文字列は改行文字のため中断されません。しかし、実行後:
dos2unix dependencies.txt
Grepは私が望む一致を表示し始めます。
grepの仕組みについての私の理解は間違っているようです。クエリの間に改行がない場合、grepがオペレーティングシステムによってファイルの内容によって異なる動作をするのはなぜですか?
追加情報
file dependencies.txt
返品dependencies.txt: Little-endian UTF-16 Unicode text, with CRLF, CR line terminators
LC_ALL=C grep log4j dependencies.txt
何も返さないgrep o dependencies.txt
返品Binary file depdencies.txt matches
grep --text dependencies.txt
何も返されませんでした
ベストアンサー1
UTF-16テキストは16ビットフラグメントで構成されているため、各文字は少なくとも二つバイト。 ASCII文字の場合、他のすべてのバイトは0バイトです(\0
文字0以外のNULバイト)。 Macがこの問題を処理するように設定されていない可能性があります。
特に、CのNULバイトは文字列ターミネータとして扱われるため、多くのツールでこれをまったく処理できない可能性があります。処理できるとしても、各 NUL を異なる文字で処理できるため、l.o.g.4.j
文字列を一致させるにはこのような文字が必要です。
しかし、興味深いことに、NULバイトは印刷時に表示されないため、cat
ファイルを端末に送信すると正常に見えることがあります。
NULはgrepがファイルバイナリを考慮する理由でもあります。
また見なさい:grepがファイルをバイナリとして扱うのはなぜですか?