2009-05-18 21 views

cevap

12

Hile, "bekletme alanında" görülen son satırı saklamaktır.

sed -n ' 
/^xxxx/{n 
     n 
     x 
     d 
     } 
x 
1d 
p 
${x 
    p 
} 
' <input file> 

x ile başlayarak - tutma alanı (x), daha sonra ilk satırı için bir şey (1d) baskı yok, daha sonraki satırlar sadece tutun uzaydan takas hattı yazdırmak ile geçerli giriş hattını takas (p), son satırda tutma alanını tekrar değiştirin ve içinde ne olduğunu yazdırın ($x{x p}. Bu, hedef satırına (/^xxxx/'u başlattığımızda) ne yapmamız gerektiğine karar verir - desen boşluğuna sonraki iki satırı okuyun (n n) ve desen boşluğunu tutma alanıyla değiştir (x) - bu, yazdırmak istediğimiz satırda tutma alanını ve maçtan önceki çizgi ile desen alanını bırakır. Bu desen uzayda iki satır bir pencere tutar

echo -e "a\nyyyy\nxxxx\nzzzz\nb" | sed 'N;/^xxxx/M{/^xxxx/d;$!N;d};P;D' 
a 
b 

ve: Biz istemiyoruz h, bu yüzden Bu (GNU sed) için işe yarayabilecek onu (d)

+0

bir başka açıklama Kalıp boşluğunu, bekletme arabelleği ile "eXchange" olan "x" komutu: http://www.grymoire.com/Unix/Sed.html#uh-53 –

+0

Yukarıdaki betiği çalıştıramıyorum. sed diyor: FUNCTION/^ pattern/{n n x d} x 1d p $ {x p} neden ayrıştırılamıyor? –

0

Perl'de böyle yapardım belki de doğru yolda size yol gösterebilir ... İyi şanslar!

open(INFILE,"<in.txt"); 
my(@arrayOutBoundData, $skipNextLine)l 
for (<INFILE>) { 
    if (not $skipNextLine) { 
     if (/^xxxx$/) { 
      pop(@arrayOutBoundData); 
      $skipNextLine = 1; 
     } else { 
      push(@arrayOutBoundData,$_); 
     } 
    } 
$skipNextLine = 0 
} 

open(OUTFILE,">out.txt"); 
for (@arrayOutBoundData) { 
    print OUTFILE; 
} 

(site üzerinde herhangi affet bu sistemde hiçbir perl test değildir.) Sen this document

1

kontrol edebilirsiniz. Birden çok satırla çalışmak için sed'u kullanır.

-1
grep -v -f <(grep -1 "xxxx" file) file 
0

hendek Gerekli regexp, birinci veya ikinci satırda bulunursa, aşağıdaki satırı okur ve sonra üç çizgiyi de siler. Önceden/sonra bir satır olmadığında regexp, ya ilk ya da son satırlarda bulunursa, kenar durumları budur. Bu durumlarda sadece iki satır silinebilir. Bu çözüm GNU sed'de olası bir hatayı ortaya çıkarmış olabilir. Bir adresin M bayrağı, ^ ve $ meta karakterlerinin, çok satırlı dizelerdeki satırın başlangıcı ve bitişi için bir regexp'de sıfır uzunluk işaretleri olarak kullanılmasına izin verir. Boş adres //, daha önce belirtilen bir adresi yeniden kullanır. Bu adres çok satırlı bir bayrağı içeren bir adres olmalı mı?

sed 'N;/^xxxx/M{//d;$!N;d};P;D' file 

xxxx bir dosyanın ikinci satırında görüntülenir: Halen, yani

sed 'N;/^xxxx/M{/^xxxx/d;$!N;d};P;D' file 

için sonuç, farklı bir (doğru) üretir Belirtildiği olmasa bile bayrak görünmektedir.

+0

Neredeyse, ama zzzz'in de ortadan kaybolmasını istiyor. –

+0

@SamuelEdwinWard basit düzeltme düzenlemeye bakın. – potong

0

Aşağıdaki kullanabilirsiniz:

sed -n '/xxxx/{N;s/.*//;x;d;};x;p;${x;p;}' 

Bu bir satır boşluk 3 satırları yerini alacak.

0

Önce, dosyayı ters eşleşti çizgi ve sonraki satırın (veya çizgiler, +Nd komut sed olarak) silmek için sed kullanın ve nihayet geri sonucunu tersine çevirebilir:

tac old.file | sed -e '/xxxx/,+1d' | tac > new.file 
İlgili konular