私はLinuxを使います。何千もの設定ファイルの中に隠された厄介な^ M(Windows cariage return)があります、そしてそれはサーバを失敗させるのでそれを見つける必要があります。
設定ファイルでいっぱいのディレクトリ階層の中から^ Mを見つけるにはどうすればいいですか?
Bashコマンドラインで^ Mを入力できないと思います。しかし、私はそれを私がm.txtと呼んだテキストファイルで持っています
grep -r $'\r' *
Bashでは、再帰的検索には-r
を、cスタイルのエスケープには$''
を使用してください。
もっと、あなたはそれがテキストファイルであると確信しているなら、それは実行しても安全であるべきです
tr -d $'\r' < filename
ファイル内のすべての\r
を削除します。
GNU sed
を使用すると、-i
はインプレース編集を実行できるため、書き戻す必要はありません。
sed $'s/\r//' -i filename
私が試したとき、私はそれが一種の仕事であると言うことができました、しかしラインは空白を印刷していました。オプションを追加してください。
--color=never
あなたがこの問題に遭遇したら、私はそれが\r
文字を妨害するカラーハイライト用のエスケープ文字だと思います。
サーバーにbashシェルがない場合は、grep
に-f
オプションを\r
を含む準備済みファイルと組み合わせて使用することもできます。
ファイルを作成するには
$ 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つだけです。
行末文字にgrepを使うには、ファイルがバイナリであることをgrepに伝えなければなりません。
-l(文字L)はファイル名だけを表示します。
-PはPerlの正規表現用です(したがって、\ x0dは\ rまたは^ Mに変換されます)。
grep -l --binary -P '\x0d' *
あなたの質問を正しく理解しているなら、本当に望むのはすべての行末をUnix LF(\x0a
)標準に正規化することです。これは、CR(\xod
)をむやみに削除するのと同じではありません。
改行にCRだけを使用するMacファイルがある場合、それらのファイルを破棄します。 (はい、Macはほぼ20年以来LFを使用するはずですが、(2019年には)CRだけを使用する多くのMacアプリがまだあります)。
Perlの\R
linebreak escape を使用して、あらゆる種類の改行を\n
に置き換えることができます。
Perl -i.bak -pe 's/\R/\n/g' $your_file
これにより、任意の種類の改行が\n
の$your_file
に置き換えられ、元のファイルのバックアップが${your_file}.bak
に保持されます。
あなたがMac上にいて、 自作 を使うなら、あなたはすることができます:
brew install tofrodos
fromdos file.txt
からすべてのWindowsキャリッジリターンを削除する file.txt
Windowsのキャリッジリターンに戻るには、
todos file.txt
前の回答をフォローアップすると、 'tr'メソッドが適しています。
533 $ if [[-n "tr -cd "\r" <~/.bashrc
"]];それから "DOS"をエコーする。そうでなければ "UNIX"をエコーします。 fi
UNIX
534 $ if [[-n "tr -cd "\r" <dosfile.txt
"]];それから "DOS"をエコーする。そうでなければ "UNIX"をエコーします。 fi
DOS
正規表現スタイルでは、さまざまな改行があります。
窓(CR LF)\r\n
Unix(LF)\n
\r\n
シーケンスはかなり独特なので、私はあなたがそのようにそれを検索することができるべきであると思いますか?
さらに悪いことに、Macは改行の代わりに '\ r'を使っていました。私はこれを検証することはできませんが、私はMacOSX世代がそれ以上それをするとは思わない。
古いMac(CR)\r