web-dev-qa-db-ja.com

Linuxでgrepを使用してdos行末(CRLF)を含むファイルを検索するにはどうすればよいですか?

Linuxでgrepを使用して、DOS行末を含むファイルを検索したい。このようなもの:

grep -IUr --color '\r\n' .

上記はリテラルrnに一致するようですが、これは望ましいものではありません。

この出力はxargsを介してtodoにパイプされ、このようにcrlfをlfに変換します

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
113
Tim Abell

つかいます Ctrl+V、 Ctrl+M grep文字列にリテラルの復帰改行文字を入力します。そう:

grep -IUr --color "^M"

動作します-^M提案したとおりに入力したリテラルCRがあります。

ファイルのリストが必要な場合は、-lオプションも。

説明

  • -Iバイナリファイルを無視
  • -Uは、grepがCR文字を取り除くことを防ぎます。デフォルトでは、テキストファイルであると判断した場合に実行します。
  • -r各ディレクトリ下のすべてのファイルを再帰的に読み取ります。
110
pjz

grepはおそらくこれに必要なツールではありません。すべてのファイルのすべての一致する行に対して行を出力します。たとえば、10行のファイルでtodosを10回実行する場合を除き、grepを使用するのが最善の方法ではありません。 findを使用してツリー内のすべてのファイルでファイルを実行し、それを「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
143
Thomee
49
Steven Penny

Grepのバージョンが-P(--Perl-regexp)オプションをサポートしている場合、

grep -lUP '\r$'

使用することができます。

16
Linulin
# 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
7
yabt

クエリは検索でした...私は同様の問題を抱えています...誰かがバージョン管理に混合行末を提出したので、今では0x0d0x0d0x0a行末。ご了承ください

grep -P '\x0d\x0a'

すべての行を見つけますが、

grep -P '\x0d\x0d\x0a'

そして

grep -P '\x0d\x0d'

行が見つからないため、行末のパターンに関してはgrep内で何か「その他」が発生する可能性があります...残念ながら私にとっては!

3
Peter Y

UNIXではfileコマンドを使用できます。ファイルの文字エンコーディングと行末記号を提供します。

$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF  

私のように、ミニマリストunixにfileコマンドのような機能が含まれておらず、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

上記の変更には、次のものが含まれます。

  • findコマンドを微調整して、スキャンするファイルのみを検索します
  • dumpコマンドをodまたは使用しているファイルダンプユーティリティに変更します。
  • cutコマンドに、先頭と末尾のスペースとdumpユーティリティからの16進文字出力の両方が含まれていることを確認します。
  • dump出力を最初の1000文字程度に制限して、効率を上げます

たとえば、dumpの代わりにodを使用すると、次のように動作します。

 od -t x2 -N 1000 $file | cut -c8- | egrep -m1 -q ' 0d| 0d|0d$'
1
MykennaC