2016-03-19 3 views
1

Ich habe Konsolausgabe bekam, etw wie:Bash sed Linien mit Worten Löschen in einem anderen Muster bestehenden

SECTION/foo 
SECTION/fo1 
SECTION/fo3 

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

als Ausgang, ich will haben:

Foo = N 
Fo1 = N 
Fo3 = N 

Alle (einfach) Lösung?

Vielen Dank im Voraus!

+0

Willkommen zu SO, bitte zeigen Sie Ihre Codierung Anstrengungen. [Stack Overflow] (http://stackoverflow.com/tour) ist eine Frage-Antwort-Website für professionelle und enthusiastische Programmierer. – Cyrus

+1

Was macht diese drei Linien besonders? Ich sehe nicht das Muster –

+0

@joelgoldstick Foo, Fo1 und Fo3 sind in den ersten 3 Zeilen, nach SECTION/ –

Antwort

1

awk Verwenden Sie tun können:

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

Foo = N 
Fo1 = N 
Fo3 = N 

Beschreibung:

  • Wir jede Zeile geteilt benutzerdefinierte Feldtrenn als ' *[/=] *' mit was bedeutet / oder = mit 0 oder mehr Räume auf jeder umgeben Seite.
  • Wenn erstes Feld ist SECTION dann speichern wir jede Kleine Spalte 2 in ein Array a
  • Später, wenn Klein erster Spalt in Array gefunden wird a dann drucken wir jede Zeile (Default Action).
+1

Würde es Ihnen etwas ausmachen zu beschreiben, wie es funktioniert? Ich bin nicht wirklich vertraut mit awk, aber es scheint mächtig :) –

+0

Ich habe eine Erklärung in der Antwort hinzugefügt. – anubhava

1

Perl zur Rettung!

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

Eine Hash-Tabelle wird aus Zeilen erstellt, die SECTION/ enthalten. Wenn die Zeile = enthält und ihre linke Seite im Hash gespeichert ist, wird sie gedruckt.

+0

Plus-Uno für "zur Rettung" (und Arbeitscode UND eine Erklärung). Wo habe ich diesen Ausdruck schon mal gehört ?! ;-) Viel Glück für jeden. – shellter

0

Dies könnte für Sie arbeiten (GNU sed):

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

Sammle alle SECTION Linien im Laderaum (HS). Verdoppele die Linie und grenze sie durch einen Zeilenumbruch ab. Fügen Sie die gesammelten Zeilen vom HS an und konvertieren Sie alles vom ersten Zeilenende bis zum Ende in Kleinbuchstaben. Unter Verwendung einer Rückreferenz wird die Variable mit dem Abschnittsuffix verglichen, und wenn dies der Fall ist, wird nur die erste Zeile, d. H. Die Originalzeile, unverfälscht gedruckt.

N.B. Die -n ruft die grep-ähnliche Natur von sed auf und die -r reduziert die Anzahl der Backslashes, die benötigt werden, um eine Regexp zu schreiben.

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