Linuxでgrepを使用して、DOS行末を含むファイルを検索したい。このようなもの:
grep -IUr --color '\r\n' .
上記はリテラルrn
に一致するようですが、これは望ましいものではありません。
この出力はxargsを介してtodoにパイプされ、このように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はおそらくこれに必要なツールではありません。すべてのファイルのすべての一致する行に対して行を出力します。たとえば、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
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'
行が見つからないため、行末のパターンに関してはgrep内で何か「その他」が発生する可能性があります...残念ながら私にとっては!
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
上記の変更には、次のものが含まれます。
たとえば、dumpの代わりにodを使用すると、次のように動作します。
od -t x2 -N 1000 $file | cut -c8- | egrep -m1 -q ' 0d| 0d|0d$'