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後で印刷されないカラーエスケープによって上書きされます。パスワード。

おすすめ記事