2012-03-02 16 views
48

sed ürününe yeni kayıt yapıyorum ve şu sorularım var. Bu örnekte:belirli bir dizgi içermeyen sed silme çizgileri

some text here 
blah blah 123 
another new line 
some other text as well 
another line 

Ya dize 'text' ve veya dize 'selam' içeren dışındaki tüm satırları silmek istiyorum, bu yüzden benim çıktı dosyası şuna benzer:

some text here 
blah blah 123 
some other text as well 

Bunun sed kullanılarak nasıl yapılabileceği hakkında ipuçları var mı?

+3

cevap sed kullanıyor? grep bunu çok kolay yapardı. – Tim

cevap

11

Yalnızca 've' ve 'veya' arasındaki ayrımın oldukça önemli olduğu 'metin' veya 'blah' (veya her ikisi) ile eşleşen satırları yazdırmak istersiniz.

sed -n -e '/text/{p;n;}' -e '/blah/{p;n;}' your_data_file 

-n, varsayılan olarak yazdırma anlamına gelir. İlk kalıp 'metin' arar, eşleşirse yazdırır ve bir sonraki satıra atlar; ikinci model, 'blah' için aynı şeyi yapar. Eğer 'n' orada değilse, o zaman 'metin ve blah' içeren bir satır iki kere basılırdı. Her ne kadar sadece -e '/blah/p' kullanabilsem de, simetri daha iyidir, özellikle de eşleşen sözcüklerin listesini genişletmeniz gerekiyorsa.

sed sürümünüz genişletilmiş düzenli ifadeler destekliyorsa (örneğin, GNU sed-r ile yapar), o zaman bu kolaylaştırabilirsiniz: Bu sizin için işe yarayabilecek

sed -r -n -e '/text|blah/p' your_data_file 
+3

Eğer sed '-r'yi desteklemiyorsa, muhtemelen {{}' yi de desteklemez. Bu, daha yaşlı seds ile çalışmalıdır: 'sed'/text \ | blah /! D 'file' –

+0

'{...}' komutların gruplandırılması, 7. Bunun desteklenmediği bir sürümle nasıl karşılaşacağını düşünemiyorum. –

79

:

sed '/text\|blah/!d' file 
some text here 
blah blah 123 
some other text as well 
+0

Teşekkürler, bu işe yarıyor. – user1246172

+1

Mesela metnin veya blahın sadece son sütunda görünebileceğini nasıl belirleyebilirim? – discipulus

+2

@lovedynasty Eğer * satırının sonunda * demek istiyorsan, kullanmalısınız '$': ''/ text $ \ | blah $ /! D'' – Melebius

5

Bunu yalnızca aşağıdaki gibi yapabilirdiniz:

İlgili konular