web-dev-qa-db-ja.com

^ Mを含むファイルを見つけるためのgrep(Windowsのキャリッジリターン)

私はLinuxを使います。何千もの設定ファイルの中に隠された厄介な^ M(Windows cariage return)があります、そしてそれはサーバを失敗させるのでそれを見つける必要があります。

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

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

67
Nicolas Raoul
grep -r $'\r' *

Bashでは、再帰的検索には-rを、cスタイルのエスケープには$''を使用してください。

もっと、あなたはそれがテキストファイルであると確信しているなら、それは実行しても安全であるべきです

tr -d $'\r' < filename

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

GNU sedを使用すると、-iはインプレース編集を実行できるため、書き戻す必要はありません。

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

私が試したとき、私はそれが一種の仕事であると言うことができました、しかしラインは空白を印刷していました。オプションを追加してください。

--color=never

あなたがこの問題に遭遇したら、私はそれが\r文字を妨害するカラーハイライト用のエスケープ文字だと思います。

12
Judson Wilson

サーバーに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つだけです。

2
Kiwi Nick

行末文字にgrepを使うには、ファイルがバイナリであることをgrepに伝えなければなりません。

-l(文字L)はファイル名だけを表示します。

-PはPerlの正規表現用です(したがって、\ x0dは\ rまたは^ Mに変換されます)。

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

あなたの質問を正しく理解しているなら、本当に望むのはすべての行末をUnix LF(\x0a)標準に正規化することです。これは、CR(\xod)をむやみに削除するのと同じではありません。

改行にCRだけを使用するMacファイルがある場合、それらのファイルを破棄します。 (はい、Macはほぼ20年以来LFを使用するはずですが、(2019年には)CRだけを使用する多くのMacアプリがまだあります)。

Perlの\Rlinebreak escape を使用して、あらゆる種類の改行を\nに置き換えることができます。

Perl -i.bak -pe 's/\R/\n/g' $your_file

これにより、任意の種類の改行が\n$your_fileに置き換えられ、元のファイルのバックアップが${your_file}.bakに保持されます。

1
mivk

あなたがMac上にいて、 自作 を使うなら、あなたはすることができます:

brew install tofrodos
fromdos file.txt

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

Windowsのキャリッジリターンに戻るには、

todos file.txt
0
kortina

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

533 $ if [[-n "tr -cd "\r" <~/.bashrc"]];それから "DOS"をエコーする。そうでなければ "UNIX"をエコーし​​ます。 fi

UNIX

534 $ if [[-n "tr -cd "\r" <dosfile.txt"]];それから "DOS"をエコーする。そうでなければ "UNIX"をエコーし​​ます。 fi

DOS

0

正規表現スタイルでは、さまざまな改行があります。

窓(CR LF)
\r\n

Unix(LF)
\n

\r\nシーケンスはかなり独特なので、私はあなたがそのようにそれを検索することができるべきであると思いますか?

さらに悪いことに、Macは改行の代わりに '\ r'を使っていました。私はこれを検証することはできませんが、私はMacOSX世代がそれ以上それをするとは思わない。

古いMac(CR)
\r

0
Jeff Atwood