Windows行末キャリッジリターンが一致したときにgrep --colorが出力を破損するのを防ぐ方法は?

Windows行末キャリッジリターンが一致したときにgrep --colorが出力を破損するのを防ぐ方法は?

次の行を含むファイルがあります。

x
y

私が走るとき

grep -E "x$" filename.txt

何も一致しません。 viが^Mほとんどの行の末尾に表示されるように、問題はDosとUnix改行文字とgrepが混在して型を自動的に検出することだと推測されます。

頑張った

grep --color=never -E "x.$" filename.txt

\r行末の追加項目と一致すると機能しますが、単一文字を印刷する\rため--color=always、端末制御文字を追加すると壊れます。

\r\n$私に必要なのは、と\n一致するオプションです$

サンプルファイルの16進ダンプ:

00000000 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 |xxxxxxxxxxxxxxxxx|  
00000010 78 78 78 78 78 78 78 78 78 78 780d 0a790a     |xxxxxxxxxxxx..y.|

DOSラインターミネーターとUnixラインターミネーターを見ることができます。この行を印刷すると、出力は空白のように見え、grep -E --color=always "x.$"一致するキャリッジリターンを含めるgrep -E --color=never "x.$"ことができます。\r.

答え1

GNUを使用している場合は、PCREのシンボルをgrep使用してスペースを一致させることができるため、ゼロ個以上のスペース文字が一致します。\s\s*

$ printf 'x\r\nxx\n' > file
$ grep --color=no -P 'x\s*$' file

xx

空行のように見えるのは実際には空ではありません。これにより、\r端末が後方に移動してx*が上書きされます。次のことで、実際に機能している様子を確認できますod

$ grep -P 'x\s*$' file | od -c
0000000   x  \r  \n   x   x  \n
0000006

GNUがない場合は、同じ方法でgrepPOSIX文字クラスを使用できます。[:space:]

$ grep 'x[[:space:]]*$' file | od -c
0000000   x  \r  \n   x   x  \n
0000006

または、次の標準ツールを使用すると\r削除も簡単です。trsed

$ tr -d '\r' < file | grep 'x$'
$ tr -d '\r' < file | grep 'x$'
x
xx
$ sed 's/\r//' file | grep 'x$'
x
xx

* 説明したように参考にしてくださいおじさんgrep、これはエイリアスがあるために発生します。grep --color=autoこれは、カラーコードが周囲に印刷されることを意味しますxxこれにより、\rターミナルがカーソルを後ろに移動し、x後で印刷されないカラーエスケープによって上書きされます。パスワード。

答え2

私にとって必要なのは、\r\n$と\nwith$`を一致させるオプションです。

次のことができます。

$ grep 'x^M\?$' infile

「^ M」と入力するには、ctrlキーを押しながらキーを押してから、Vもう一度ctrlキーを押してMコマンドラインを押す必要があります。 Aが^M表示され、1carriage return文字をエンコードします。

grepの出力はまだcarriage return端末に印刷位置を行の先頭に戻し、そこから印刷を続けるように指示する文字が含まれています。これは奇妙な結果につながる可能性があります。

クリーンアップファイルを使用することをお勧めしますdos2unix

dos2unix infile >clean.infile

または(たとえば、ファイルを分類せずにdos2unixが直接読み取ることができます):

cat infile | dos2unix | grep 'x$'

関連情報