grep
テキスト処理ツールです。入力はテキストファイルであると想定しています。同じことがtr
macOSにも当てはまるようtr
です(バイナリファイルをサポートするはずですが)。
コンピュータは、データをバイトシーケンスとして格納します。テキストは一連の文字です。文字をバイトとしてエンコードするには、文字エンコードと呼ばれるいくつかの方法があります。世界のほとんど、特にOSXでの事実上の標準文字エンコードはUTF-8で、これはUnicode文字セットのエンコードです。256バイトしかありませんが、100万を超えるUnicode文字が可能なため、ほとんどの文字は複数バイトとしてエンコードされます。UTF-8は可変長エンコードです。文字に応じて、1文字から4バイトで文字をエンコードできます。バイトシーケンスの中には、UTF-8の文字を表さないものがあります。したがって、有効なUTF-8テキストファイルではないバイトシーケンスがあります。
tr
そのようなバイトシーケンスに遭遇したため、文句を言っています。UTF-8でエンコードされたテキストファイルが表示されますが、有効なUTF-8ではないバイナリデータが表示されます。
Microsoft Word文書はテキストファイルではなく、ワープロ文書です。ワープロドキュメント形式は、テキストだけでなく、書式設定、埋め込み画像などもエンコードします。ほとんどのワードプロセッシング形式と同様に、Word形式はテキストファイルではありません。
ロケールを変更することで、バイトを操作するようにテキスト処理ツールに指示できます。具体的には、「C」ロケールを選択します。これは基本的に「空想なし」を意味します。コマンドラインで、環境変数を使用してロケール設定を選択できます。
export LC_CTYPE=C
tr '\r' '\n' < target-file | grep search-string
これはエラーを出力しませんが、target-file
指定するほとんどの検索文字列を含む可能性が低いバイナリファイルであるため、有用なことは何も行いません。
ちなみに、tr '\r' '\n'
Mac OS 9以前のテキストファイルが残っていない限り、これはあまり便利なコマンドではありません。\r
(キャリッジリターン)は、Mac OS X以前のMac OSの改行セパレーターでした。OSXから、改行セパレーターは\n
(改行、Unix標準)であり、テキストファイルにはキャリッジリターンが含まれていません。Windowsは2文字のシーケンスCR-LFを使用して改行を表します。tr -d '\r'
WindowsテキストファイルをUnix / Linux / OSXテキストファイルに変換します。
それでは、コマンドラインからどのようにWord文書を検索できますか?.docx
Word文書が実際にzipアーカイブ複数のファイル、にある主なもの含むXMLを。
unzip -l Position-Paper-Final-Version.docx
Mac OS Xには、zipファイル内を検索するzipgrepユーティリティが含まれています。
zipgrep DeCSS Position-Paper-Final-Version.docx
docx形式のXMLファイルの大部分は1つの大きな行で構成されているため、結果はあまり読みやすくなりません。ドキュメントの本文テキスト内を検索する場合word/document.xml
は、アーカイブからファイルを抽出します。このファイルには、文書のテキストに加えて、文書の構造を表すXMLマークアップが含まれていることに注意してください。XMLマークアップを少しマッサージして、sed
管理しやすい行に分割できます。
unzip -p Position-Paper-Final-Version.docx word/document.xml |
sed -e 's/></>\n</g' |
grep DeCSS