grep で ^M を含むファイルを見つける (Windows のキャリッジリターン)

grep

私はLinuxを使っています。何千もの設定ファイルのどこかに、厄介な^M(Windowsのcariageリターン)が隠されていて、私はそれを見つけなければならない、それはサーバーが失敗するので

設定ファイルでいっぱいのディレクトリ階層の中から ^M を見つけるには?

bashのコマンドラインで^mが入力できないと思います。でも、m.txtというテキストファイルに入れています

  79  Nicolas Raoul  2010-10-01


ベストアンサー

grep -r $'\r' *

Bashでは再帰検索には-rを、cスタイルエスケープには$''を使用します

さらに、テキストファイルであることを確認しているのであれば、実行しても問題ないはずです

tr -d $'\r' < filename

でファイル内のすべての\rを削除します

GNU sedを使っている場合、-iはその場で編集を行いますので、ファイルを書き戻す必要はありません

sed $'s/\r//' -i filename

99  livibetter  2010-10-01


試してみたところ、なんとなく動いていたのですが、行が空白で印刷されていました。オプションで追加します

--color=never

この問題が発生した場合、カラーハイライト用のエスケープ文字が\rの文字に干渉しているのではないかと思います

13  Judson Wilson  2012-07-25


私があなたの質問を正しく理解しているなら、あなたが本当にしたいことは、すべての行末をUnixのLF (\x0a)標準に正規化することです。これは、やみくもに CR (\x0d) を削除するのと同じではありません

もし、たまたま改行にCRだけを使っているMacのファイルが周りにあったら、それらのファイルを破壊してしまいます。(そう、Macは20年近く前からLFを使うことになっていますが、(2019年現在でも)CRだけを使っているMacアプリはたくさんあります)

Perl の \R linebreak escape を使って、あらゆる種類の改行を \n に置き換えることができます

perl -i.bak -pe 's/\R/\n/g' $your_file

これは、元のファイルのバックアップを${your_file}.bakに保持しながら、\n$your_fileの中の\nに置き換えることができます

3  mivk  2019-08-16


サーバにbashシェルがない場合は、grep-fオプションをつけて、\rを含むファイルを用意した上で、grep-fオプションをつけるという方法もあります

作成すること

$ echo -ne '\r' > /tmp/cr                    --or--                   $ printf '\r' > /tmp/cr

$ od -c /tmp/cr
0000000  \r
0000001

実際に検索をすること

$ grep -f /tmp/cr *.html *.php *.asp *.whatever

と入力するか、少し怠け者になって*,と入力してください

$ grep -f /tmp/cr *

grep-f filenameオプションは、一致させるパターンを含むファイルを1行に1つずつ指定するために使用されます。この場合、パターンは1つだけです

2  Kiwi Nick  2011-09-29


行末の文字でgrepを使うには、ファイルがバイナリであることをgrepに伝える必要があると思います

-l (L字) はファイル名のみを印刷するためのものです

-PはPerlの正規表現(なので、\x0dは\rや^Mに変換されます)のためのものです

grep -l --binary -P '\x0d' *

1  Vouze  2016-08-23


Macでhomebrewを使っていればできます

brew install tofrodos
fromdos file.txt

をクリックして、file.txtからWindowsのキャリッジリターンをすべて削除します

Windowsのキャリッジリターンに切り替えるには、次のようにします

todos file.txt

0  kortina  2011-10-10


正規表現スタイルでは、様々な改行

Windows(CR LF)\r\n

Unix (LF) <++1

\r\nの配列はかなり特殊なので、そのように検索してもいいのではないでしょうか?

さらに悪いことに、Macでは改行の代わりに「\r」だけが使われていた。確認できないけど、MacOSX世代ではもうそんなことはしていないと思う

古いMac(CR)\r

0  Jeff Atwood  2010-10-01


前回の回答に続き、「tr」の方法が良いです

533$ if [[ -n “tr -cd "\r" <~/.bashrc“]] ]]; then echo “DOS”; else echo “UNIX”; fi

UNIX

534$ if [[ -n “tr -cd "\r" <dosfile.txt“]] ]]; then echo “DOS”; else echo “UNIX”; fi

DOS

0  Malcolm Boekhoff  2014-11-21


タイトルとURLをコピーしました