
次の行を含むファイルがあります。
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
後で印刷されないカラーエスケープによって上書きされます。パスワード。
答え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$'