私は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

