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