Linux で grep を使用して dos 行末 (CRLF) を含むファイルを検索するにはどうすればよいですか?
質問
Linux 上で dos 行末を含むファイルを grep で検索したいと考えています。このようなもの:
grep -IUr --color '\r\n' .
上記はリテラルに一致するようです rn
それは望まれるものではありません。
この出力は xargs を介して todos にパイプされ、次のように crlf を lf に変換します。
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
解決
使用 Ctrl+V, Ctrl+M リテラルの復帰文字を grep 文字列に入力します。それで:
grep -IUr --color "^M"
動作します - の場合 ^M
私が提案したように、入力したリテラルの CR があります。
ファイルのリストが必要な場合は、 -l
オプションも。
説明
-I
バイナリファイルを無視する-U
grep が CR 文字を削除するのを防ぎます。デフォルトでは、テキスト ファイルであると判断した場合に実行されます。-r
各ディレクトリの下にあるすべてのファイルを再帰的に読み取ります。
他のヒント
grep はおそらくこれに必要なツールではありません。すべてのファイル内の一致する行ごとに 1 行ずつ出力されます。たとえば、10 行のファイルで todo を 10 回実行する場合を除き、grep は最適な方法ではありません。find を使用してツリー内のすべてのファイルに対して file を実行し、それを「CRLF」で grep すると、dos スタイルの行末を持つファイルごとに 1 行の出力が得られます。
find . -not -type d -exec file "{}" ";" | grep CRLF
次のようなものが得られます:
./1/dos1.txt: ASCII text, with CRLF line terminators
./2/dos2.txt: ASCII text, with CRLF line terminators
./dos.txt: ASCII text, with CRLF line terminators
grep -IUlr $'\r'
grep のバージョンがサポートしている場合 -P (--perl-regexp) オプション、その後
grep -lUP '\r$'
使用することができます。
# list files containing dos line endings (CRLF)
cr="$(printf "\r")" # alternative to ctrl-V ctrl-M
grep -Ilsr "${cr}$" .
grep -Ilsr $'\r$' . # yet another & even shorter alternative
クエリは検索でした...同様の問題があります...誰かがバージョンコントロールに混合ラインエンディングを提出したので、今ではたくさんのファイルがあります 0x0d
0x0d
0x0a
行末。ご了承ください
grep -P '\x0d\x0a'
はすべての行を検索しますが、
grep -P '\x0d\x0d\x0a'
そして
grep -P '\x0d\x0d'
線が見つからないので、ラインエンディングパターンに関しては、グレップ内で何か「他の」が起こっている可能性があります...残念ながら私にとっては!
私と同じように、あなたのミニマリスト UNIX に次のような優れた機能が含まれていない場合は、 ファイル コマンドとバックスラッシュ grep 式が連携しない場合は、これを試してください。
$ for file in `find . -type f` ; do
> dump $file | cut -c9-50 | egrep -m1 -q ' 0d| 0d'
> if [ $? -eq 0 ] ; then echo $file ; fi
> done
上記に対して行う必要がある変更は次のとおりです。
- 微調整する 探す スキャンしたいファイルのみを検索するコマンド
- 変更 ごみ に命令する OD またはお持ちのファイル ダンプ ユーティリティ
- ことを確認します カット コマンドには、先頭と末尾のスペースの両方と、コマンドから出力された 16 進文字だけが含まれます。 ごみ ユーティリティ
- を制限する ごみ 効率化のため、最初の 1000 文字程度まで出力します。
たとえば、次のようなものはうまくいくかもしれません OD の代わりに ごみ:
od -t x2 -N 1000 $file | cut -c8- | egrep -m1 -q ' 0d| 0d|0d$'
UNIXではfileコマンドが使えます。ファイルの文字エンコーディングと行末記号が表示されます。
$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF