2017-06-01 8 views
2

私はCent OS7でbashスクリプトを書いています。今度は、.jpgまたは.jpegを含まないすべての行を削除するには、sedを使用する必要があります。
sedが0または1に一致しない

は、ここに私のスクリプトです:

sed -i -e '/\.jp(e)?g/!d' myfile 

しかし、それは期待どおりに動作しないことを意味し、すべての行を削除します。

ただし、​​またはsed -i -e '/\.jpeg/!d' myfileの場合どちらもうまくいきます。

答えて

3

キャプチャされたグループ(())と数値限定器?(先行するトークンと一致する0または1回)は、BRE(基本正規表現)ではなくERE(拡張正規表現)で表示されます。

sedはデフォルトでBREを使用しているため、トークンは文字通り処理されます。 、EREを有効(利用可能な場合または-rsed-Eを使用するには

eをキャプチャ

sed -E '/\.jp(e)?g/!d' myfile 

はここに冗長です:あなたはEREトークンを使用することができ、という

sed -E '/\.jpe?g/!d' myfile 

注意\でBREからエスケープすると、次のようになります。

sed '/\.jp\(e\)\?g/!d' myfile 
sed '/\.jpe\?g/!d' myfile 

これもまた、1つのオプション、つまり-Eを使用した場合と同じようには見えません。あなたがこれを望む唯一のケースは移植性です。

0

sedコマンドの正規表現を使用すると、必要な条件を満たす可能性があります。ゼロまたは1つの 'e'は、次のようにフィルタリングされます。

sed -i -e '/jpe\?g/!d' myfile

0

これはあなたのために働くかもしれない(GNUのSED):交互の一つが空である

sed '/\.jp\(e\|\)g/!d' file 

使用交代を。おそらく、

交互にリストされているかどうかを確認しやすい:

sed '/\.jpeg\|\.jpg/!d' file 

しかし、すでに?を使用し、述べてきたとおり

sed '/\.jpe\?g/!d' file 

N.B. *はゼロ以上即ち

sed '/\.jpe*g/!d' file 

可能になるで.jpeeeeeeeeeeeeeeeeg

関連する問題