次の行を含むファイルがあります。
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がない場合は、同じ方法でgrep
POSIX文字クラスを使用できます。[:space:]
$ grep 'x[[:space:]]*$' file | od -c
0000000 x \r \n x x \n
0000006
または、次の標準ツールを使用すると\r
削除も簡単です。tr
sed
$ 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
これは、カラーコードが周囲に印刷されることを意味しますx
。x
これにより、\r
ターミナルがカーソルを後ろに移動し、x
後で印刷されないカラーエスケープによって上書きされます。パスワード。