grep(^ Mを含むファイルを検索する(Windowsのキャリッジリターン)


72

Linuxを使用しています。厄介な^ M(Windows cariage return)が何千もの構成ファイルに隠されており、サーバーが失敗するため、見つけなければなりません。

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

bashコマンドラインに^ Mを入力できないと思います。しかし、私はm.txtと呼ばれるテキストファイルにそれを持っています



ウィンドウは^ M ^ J
barlop

3
「bashコマンドラインで^ Mを入力できません」。はい、できます。制御-VはControl-M試してみてください
ヘネス

回答:


91
grep -r $'\r' *

Bashの-r再帰検索および$''cスタイルのエスケープに使用します。

さらに、テキストファイルであることが確実な場合は、実行しても安全です。

tr -d $'\r' < filename

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

GNUを使用している場合はsed-iインプレース編集を行うことができますので、あなたが戻って書く必要はありません。

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

10
@Nicolas:^ V ^ Mを押してコマンドラインに^ Mを入力できますが、を使用することをお勧めします$'\r'
デニスウィリアムソン

うまくいきました!^ V ^ Mトリックにも感謝します:
ニコラスラウル

5
Cygwinでは、この作業を行うには-Uが必要です。-nは行番号を示します:grep -r -U -n -e $ '\ r'
Rainer Blome

4
grepコマンドに-lを追加して、ファイル名のみを表示します。それ以外の場合は、一致する行で砲撃される可能性があります。
ブレンダンバード14年

1
@upregoは今それらを理解しているかどうかはわかりませんが、fyiやその他のものは、$'manpageの最初のヒットを読んでbash(1)、基本的に、Cリテラル文字列を書いているかのように見ることができます。command < filenameの使用<またはが>呼び出されたリダイレクト、これは私は誰もがそれを呼ば見たのは初めてである大きい表現。で検索REDIRECTIONbash(1)ます。
リビベター

12

私が試したとき、私はそれがちょっと働いていたと言うことができましたが、行は空白を印刷していました。オプションを追加します。

--color=never

この問題が発生した場合、それはキャラクターを妨げる色の強調表示用のエスケープ文字だと思います\r


2

サーバーに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


2

私があなたの質問を正しく理解しているなら、本当に望むのは、すべての行末を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ます。


1

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

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

-Pはperl正規表現用です(\ x0dは\ rまたは^ Mに変換されます)

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

0

Macでhomebrewを使用している場合、次のことができます。

brew install tofrodos
fromdos file.txt

file.txtからすべてのWindowsキャリッジリターンを削除するには

Windowsのキャリッジリターンに切り替えるには、

todos file.txt

フォルダーを検索して、DOSからのすべてのファイルを削除するには、次のコマンドを実行します:find -type f -name "* .java" | xargsのをfromdos
太鼓

0

正規表現スタイルでは、さまざまな改行:

Windows(CR LF)
\r\n

Unix(LF)
\n

\r\nシーケンスはかなりユニークなので、そのように検索できるはずだと思いますか?

さらに悪いことに、Macには改行の代わりに '\ r'しかありませんでした。これを確認することはできませんが、MacOSX世代はもうそれを行うとは思わない。

古いMac(CR)
\r


m.txtを含むディレクトリでgrep "\r\n" *は、結果は得られません。どちらにegrep -e "\r\n" *も結果がありませんgrep -E "\r\n" *
ニコラスラウル

@nicolasああ、私は誤解しました..あなたはCRが\r私の悪いことだけを意味しました。完全なウィンドウの改行は実際に\r\nまたはCRLFです
ジェフ・アトウッド

0

以前の回答をフォローアップすると、「tr」メソッドが適しています。

533 $ if [[-n " tr -cd "\r" <~/.bashrc"]]; 次に、「DOS」をエコーし​​ます。それ以外の場合は、「UNIX」をエコーし​​ます。fi

UNIX

534 $ if [[-n " tr -cd "\r" <dosfile.txt"]]; 次に「DOS」をエコーし​​ます。それ以外の場合は、「UNIX」をエコーし​​ます。fi

DOS

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.