2013-04-17 31 views
8

Bir dize için bir dosya aramalıyım, dizeyi içeren tüm satırları kaldırmalı ve ayrıca dizeyi içeren herhangi bir satırı takip eden iki satırı da kaldırmalıyım. Ben ... ben böyle bu kullanarak bir şey başarabileceğimizi-V bayrağı ve -A bayrağı grep içinde birleştiriliyor

$ grep -v -A 2 two temp.txt 
one 
five 
$ 

umuyordum ... ama ne yazık ki bu işe yaramadı. Bunu grep veya başka bir kabuk komutuyla yapabileceğim basit bir şey var mı? sed GNU ve OS X hem

cevap

5

aşağıdaki eserlerini

$ sed '/two/{N;N;d;}' temp.txt 
one 
five 
  • two
  • iki hatlarında okumak eşleşen bulmak hattı
  • GNU için onlara
+0

Hem senin cevabın hem de JohnKugelman'ın özü, ikisi de GNU/Linux üzerinde çalışıyorlar ve ne OS X üzerinde çalışıyorlar (bu özel görev için benim için çok önemli değil). Sözdiziminin kısa bir açıklamasını sağlamak için kabul edilen cevap size geçer. Teşekkürler. –

+2

d ve sonrasında noktalı virgül ekleyin. Brace'ı zorla ve MacOS X üzerinde de çalışmalı. –

2

silmek sed:

sed '/two/,+2d' temp.txt 

Bu, iki sözcük satırını (/two/) ve iki çizgiden (+2) sonra eşleştirmek için iki adresli sözdizimini (addr1,addr2) kullanır. d komutu bu satırları siler.

+0

Düşünebildiğim tek şey, “+ sayı” seçeneği olmadan eski, GNU olmayan bir sed kullanıyor olabilir. Ama işe yaradığı için (ve aşağı-in-downvoters sevmiyorum), bunu tersine çevirmek için bir oy. – paxdiablo

3

Aşağıdaki transkript göre, awk ile yapabilirsiniz:

pax> echo 'one 
two 
three 
four 
five' | awk '/two/ {skip=3} skip>0 {skip--;next} {print}' 

one 
five 

Temelde uzak (3) her bir satırda two dize bulur atmak çizgilerin bir sayaç başlatır. Daha sonra, atlama sayacı sıfıra ulaşana kadar bu satırları atar. Atlama için işaretlenmemiş herhangi bir satır yazdırılır.

+0

Bu, bir iki üç iki üç dört beş "bir beş" doğru şekilde işleme avantajı vardır. –

1

İşte Perl ile yapmanın bir yolu var:

$ perl -ne'if (/two/){$x=<>;$x=<>;}else{print}' temp.txt 
one 
five 

-n girişi üzerinde örtük bir döngü. /two/ ile eşleşirseniz, sonraki iki satırı okuyun, aksi halde üzerini kapattığınız çizgiyi yazdırın.

Sorun şu ki, üçüncü veya dördüncü satırın eşleştirilmesiyle/iki/olması durumunda, yine de aynı çıktıyı elde edersiniz. @ paxdiablo'nun çözümü daha eksiksiz. Ama benimki daha fazla Q & D.