2016-03-19 16 views
1

ben konsol çıktısını var başka desende mevcut sözlerle hatları silme sed: bir çıkış olarakBash gibi sth,

SECTION/foo 
SECTION/fo1 
SECTION/fo3 

Foo = N 
Fo1 = N 
Fo2 = N 
Fo3 = N 
Bar = Y 

, ben istiyorum:

Foo = N 
Fo1 = N 
Fo3 = N 

Herhangi (basit) çözüm?

Şimdiden teşekkürler!

+0

Hoş Geldiniz, lütfen kodlama çabalarınızı gösterin. [Yığın Taşma] (http://stackoverflow.com/tour) profesyonel ve meraklı programcılar için bir soru ve cevap sitesidir. – Cyrus

+1

Bu üç satırı özel yapan nedir? –

+0

@joelgoldstick Foo, Fo1 ve Fo3 modelinin SECTION/ –

cevap

1

awk kullanarak yapabilirsiniz:

awk -F' *[/=] *' '$1 == "SECTION" {a[tolower($2)]} tolower($1) in a' file 

Foo = N 
Fo1 = N 
Fo3 = N 

Açıklama: Biz / veya = her biri üzerinde, 0 veya daha fazla boşluklarla çevrili anlamına gelir ' *[/=] *' olarak özel alan ayırıcı kullanılarak her satırı bölmek

  • yan. küçük ilk sütun dizisi a bulunduğunda
  • ilk alan SECTION olan
  • ise, bu durumda, her bir satır (varsayılan eylem) baskı a
  • sonra bir diziye her bir küçük sütun 2 saklayın.
+1

Nasıl çalıştığını açıklar mısınız? Awk ile gerçekten tanıdık değilim, ama güçlü görünüyor :) –

+0

Cevabımda bazı açıklama ekledim. – anubhava

1

Kurtarma için Perl!

perl -ne ' $h{ ucfirst $1 } = 1 if m(SECTION/(.*)); 
      print if /(.*) =/&& $h{$1}; 
     ' < input 

bir karma tablosu SECTION/ içeren hatlardan oluşturulur. Satır = içeriyorsa ve sol tarafı karmada saklanmışsa, yazdırılır.

+0

"kurtarma" (ve çalışma kodu VE bir açıklama) için pluse-uno. Şimdi bu ifadeyi daha önce nerede duydum ?! ;-) Hepinize iyi şanslar. – shellter

0

sen (GNU sed) Bu işe yarayabilecek:

sed -nr '/SECTION/H;s/.*/&\n&/;G;s/\n.*/\L&/;/\n(.*) .*\n.*\/\1/P' file 

tutun boşluk (HS) tüm SECTION satırları toplayın. Satırı ikiye katlayın ve bir satır sonuyla sınırlayın. Toplanan satırları HS'den ekleyin ve ilk yeni satırdan sonuna kadar her şeyi küçük harfe dönüştürün. Bir geri referansın kullanılması, değişkenin bölüm sonekiyle eşleşmesidir ve eğer öyleyse, sadece ilk satırı, yani orijinal satırı katkısız olarak yazdırın.

N.B. -n, sedenin grep benzeri doğasını çağırır ve -r, bir regexp yazmak için gereken ters eğik çizgi sayısını azaltır.

0
awk '$1 ~ /Foo|Fo1|Fo3/' file 
Foo = N 
Fo1 = N 
Fo3 = N