web-dev-qa-db-ja.com

''で囲まれた文字列は、grepを使用する場合は無視されます

ファイル内の文字列を検索しようとしたところ、結果に一重引用符で囲まれた文字列が含まれていませんでした。

例えば:

grep -rn text folder/

結果には、次のような文字列は含まれていませんでした。

'text'

私が間違っていることを教えてくれませんか?

更新:新しいファイルでテストしたところ、機能しました。 1つの特定のファイル(Rubyファイル)でのみ発生したようです。エンコードに関係しているのでしょうか?

5

文字コードの問題が発生している可能性があります。 grepしようとしているファイルは、システムのデフォルトのエンコーディングとは異なる文字エンコーディングである可能性があります。最近のUnixyシステムは通常デフォルトでUTF-8に設定されています。これは、7ビットASCIIと互換性がありますが、8ビットASCII拡張機能はありません。米国で一般的な8ビットエンコーディングは、 ISO 8859-1 および Windows CP-1252 。その他の地域では、さらに数十が使用されています。

grepは、すべての入力がデフォルトのシステムエンコーディングであると想定しています。別のエンコーディングのファイルをgrepするには、iconvを使用して変換します。

$ iconv -f iso8859-1 -t utf8 myfile.txt | grep something

これは再帰的な例では非常に不便だと思いますが、より広い教訓は、問題が解決した場合は、システムの文字エンコードと互換性があるように、そのディレクトリツリー内のすべてのテキストファイルを変換する必要があるということです。 Windowsテキストエディターの互換性が必要な場合でも、心配しないでください。最近のWindowsではUTF-16がネイティブに使用されていますが、コード編集に重点を置いているほとんどのWindowsテキストエディターはUTF-8に対応しています。

もう1つの可能性は、ファイルで中引用符が使用されていることです。キーボードで入力する引用符はまっすぐな引用符です-ASCII 39-ただし、一部のワードプロセッサやテキストエディタでは、中引用符に置き換えられます。または + 2019 inこの例。

このコマンドを使用してファイルを調べ、文字コードの問題を調査するのが好きです。

$ od -t x1 < myfile.txt | less

利用可能なさまざまな「16進ダンプ」プログラムがありますが、データをリトルエンディアン形式の16ビットワードとして表示するなど、役に立たないことがよくあります。 odには、まともな16進ダンププログラムのように印刷可能なテキスト表示列もないため、短いファイルに最適です。私はよく例を最初にテストしやすいものに切り詰めます。

7
Warren Young