Linuxを使用しています。厄介な^ M(Windows cariage return)が何千もの構成ファイルに隠されており、サーバーが失敗するため、見つけなければなりません。
設定ファイルでいっぱいのディレクトリ階層から^ Mを見つけるにはどうすればよいですか?
bashコマンドラインに^ Mを入力できないと思います。しかし、私はm.txtと呼ばれるテキストファイルにそれを持っています
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
$'\r'。
$'manpageの最初のヒットを読んでbash(1)、基本的に、Cリテラル文字列を書いているかのように見ることができます。command < filenameの使用<またはが>呼び出されたリダイレクト、これは私は誰もがそれを呼ば見たのは初めてである大きい表現。で検索REDIRECTIONしbash(1)ます。
私が試したとき、私はそれがちょっと働いていたと言うことができましたが、行は空白を印刷していました。オプションを追加します。
--color=never
この問題が発生した場合、それはキャラクターを妨げる色の強調表示用のエスケープ文字だと思います\r。
サーバーにbashシェルがない場合は、-fオプションon grepをを含む準備済みファイルと組み合わせて使用することもできます\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 *
オプションでは、1行につき1つにマッチするパターンを含むファイルを指定するために使用されます。この場合、パターンは1つだけです。-f filenamegrep
私があなたの質問を正しく理解しているなら、本当に望むのは、すべての行末をUnix LF(\x0a)標準に正規化することです。これは、CRをやみくもに削除するのと同じではありません(\x0d)。
改行にCRだけを使用するMacファイルがある場合、それらのファイルを破棄します。(はい、Macはほぼ20年以来LFを使用することになっていますが、CRを使用する多くのMacアプリがまだあります(2019年))。
Perlの\R 改行ブレークを使用して、あらゆる種類の改行をに置き換えることができます\n。
perl -i.bak -pe 's/\R/\n/g' $your_file
これにより、任意の種類の改行が\nin $your_fileに置き換えられ、元のファイルのバックアップがに保持され${your_file}.bakます。
正規表現スタイルでは、さまざまな改行:
Windows(CR LF)
\r\n
Unix(LF)
\n
\r\nシーケンスはかなりユニークなので、そのように検索できるはずだと思いますか?
さらに悪いことに、Macには改行の代わりに '\ r'しかありませんでした。これを確認することはできませんが、MacOSX世代はもうそれを行うとは思わない。
古いMac(CR)
\r
grep "\r\n" *は、結果は得られません。どちらにegrep -e "\r\n" *も結果がありませんgrep -E "\r\n" *
\r私の悪いことだけを意味しました。完全なウィンドウの改行は実際に\r\nまたはCRLFです