Linux で grep を使用して、DOS の行末を含むファイルを検索したいと考えています。このようなもの:
grep -IUr --color '\r\n' .
上記rn
は、望ましいものではないリテラルに一致するようです。
この出力は xargs を介して todos にパイプされ、このように crlf が lf に変換されます
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
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
Ctrl+ V, Ctrl+を使用Mして、リテラルのキャリッジ リターン文字を grep 文字列に入力します。そう:
grep -IUr --color "^M"
機能します-^M
私が提案したように入力したリテラルCRがある場合。
ファイルのリストが必要な場合は、-l
オプションも追加します。
説明
-I
バイナリ ファイルを無視する-U
grep が CR 文字を削除するのを防ぎます。テキストファイルであると判断した場合、デフォルトでこれを行います。-r
各ディレクトリの下にあるすべてのファイルを再帰的に読み取ります。RipGrepの使用(シェルによっては、最後の引数を引用する必要がある場合があります):
rg -l \r
-l, --files-with-matches
Only print the paths with at least one match.
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コマンドのような優れた機能が含まれておらず、 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$'