GrepはDOS形式のテキストファイルに行末を見つけることができませんか?

GrepはDOS形式のテキストファイルに行末を見つけることができませんか?

Ubuntuは、元のWindowsで生成されたソース管理に送信されたCファイルを処理しています。 Vim表示されるファイル形式は「dos」です。私が収集したものは、CR/LF行末があるという意味です。grepfind regexを使用してファイルの関数定義のリストを取得しようとしていますが、')$'何も返しません。ファイル形式を "unix"( :set ff=unixin vim) に変更すると、期待grepどおりに機能しました。

これはバグですか、それとも行末はgrep正式にサポートされていませんか?CR/LF私はページでこれを見つけましたman

-U --binary ファイルをバイナリとして扱います。既定では、MS-DOSとMS-Windowsでは、grepは--binary-filesオプションで説明されているように、ファイルがテキストかバイナリかを推測します。grepがファイルがテキストファイルであると判断すると、元のファイルの内容からキャリッジリターンを削除します(^と$を使用した正規表現が正しく機能するように)。-Uを指定すると、この推測は無視され、すべてのファイルを読み取り、一致するメカニズムにそのまま渡されます。これにより、ファイルが各行の末尾にCR / LFペアを持つテキストファイルである場合、一部の正規表現が失敗します。このオプションは、MS-DOS および MS-Windows 以外のプラットフォームには影響しません。

しかし、それは言うMS-DOSとMS-Windowsで前の文に記載されていますが、ここにも該当するかどうかわかりません。

別の正規表現がありますか?しなければならない一致CR/LFまたは他のコマンドラインオプションがgrep役に立たないと思いますか?それとも、同僚のファイルを再フォーマットして多くのコミットノイズを発生させることが実際に私にとって唯一の解決策ですか?

ベストアンサー1

Windows および DOS テキストファイルの場合、各行の末尾に追加のキャリッジリターンがあります。これは正規表現)$ですいいえ各行には追加のキャリッジリターン文字もあるため、すべての行と一致します。

)キャリッジリターンで終わる行を一致させるには、)[[:space:]]$as式を使用してください。この[[:space:]]ビットは、キャリッジリターンを含む単一の「空白に似た文字」と一致します。

grepあなたはまた言葉式のキャリッジリターンの場合、たとえば$')\r$'式のパラメータ文字列として使用します。一部のシェルでは、シェル$'...'がエスケープシーケンス(例:など)を\tCプログラミング言語で表される実際の文字に拡張する「C文字列」です。\r\n

のいくつかのバリエーションは、grep式を\s一致するキャリッジリターンとして認識します(より移植性の高いもののように[[:space:]])。

Unixシステムでこれらのファイルを使用する場合、最も簡単な方法は、質問で述べた方法(VimエディタでUnixテキストファイルとして保存)を使用してファイルをUnixテキストファイルに変換することです。 .convertなどのツールを使用してくださいdos2unix


「MS-DOS と MS-Windows で」というテキストは、grep特定のオペレーティングシステムで実行されることを意味します。 Ubuntuを使用しているため、これは適用されません。

おすすめ記事