147

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

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

上記rnは、望ましいものではないリテラルに一致するようです。

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

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
4

9 に答える 9

190

grep は、おそらくこれに必要なツールではありません。すべてのファイルの一致する行ごとに行を出力します。たとえば、10 行のファイルに対して todos を 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
于 2008-09-16T16:03:28.833 に答える
133

Ctrl+ V, Ctrl+を使用Mして、リテラルのキャリッジ リターン文字を grep 文字列に入力します。そう:

grep -IUr --color "^M"

機能します-^M私が提案したように入力したリテラルCRがある場合。

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

説明

  • -Iバイナリ ファイルを無視する
  • -Ugrep が CR 文字を削除するのを防ぎます。テキストファイルであると判断した場合、デフォルトでこれを行います。
  • -r各ディレクトリの下にあるすべてのファイルを再帰的に読み取ります。
于 2008-09-16T15:56:03.670 に答える
63

RipGrepの使用(シェルによっては、最後の引数を引用する必要がある場合があります):

rg -l \r
-l, --files-with-matches
Only print the paths with at least one match.

https://github.com/BurntSushi/ripgrep

于 2012-11-30T10:20:28.207 に答える
19

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

grep -lUP '\r$'

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

于 2008-09-16T17:20:10.567 に答える
11
# 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
于 2010-07-06T07:53:28.453 に答える
2

クエリは検索でした... 同様の問題があります... 誰かが混合した行末をバージョン管理に送信したため、現在、0x0d 0x0d 0x0a行末のあるファイルがたくさんあります。ご了承ください

grep -P '\x0d\x0a'

すべての行を検索しますが、

grep -P '\x0d\x0d\x0a'

grep -P '\x0d\x0d'

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

于 2010-09-22T20:57:31.213 に答える
1

私のように、ミニマリストの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コマンドに、先頭と末尾の両方のスペースと、ダンプ・ユーティリティーから出力された16進文字のみが含まれていることを確認してください。
  • 効率を上げるために、ダンプ出力を最初の1000文字程度に制限します

たとえば、このようなものは、 dumpの代わりにodを使用すると機能する可能性があります。

 od -t x2 -N 1000 $file | cut -c8- | egrep -m1 -q ' 0d| 0d|0d$'
于 2011-10-10T16:26:52.320 に答える