2013-06-28 11 views
12

Ich verwende sed, um eine Liste von Dateien zu filtern. Ich habe eine sortierte Liste von Ordnern und ich möchte alle Zeilen nach einem bestimmten erhalten. Um diese Aufgabe auszuführen, verwende ich die beschriebene Lösung here, die ziemlich gut mit jeder Eingabe funktioniert, die ich versuchte, aber es funktioniert nicht, wenn das Spiel in der ersten Zeile ist. In diesem Fall sed wird alle Zeilen des EingangsEntfernen Sie alle Zeilen vor einem Treffer mit sed

Hier ist ein Beispiel entfernen:

(ssh) [email protected] : ~ 
[0] % ls -1/
bin 
boot 
... 
sys 
tmp 
usr 
var 
vmlinuz 

(ssh) [email protected] : ~ 
[0] % ls -1/| sed '1,/tmp/d' 
usr 
var 
vmlinuz 

(ssh) [email protected] : ~ 
[0] % ls -1/| sed '1,/^bin$/d' 
# sed will delete all lines from the input stream 

Wie soll ich den Befehl beachten Sie auch den Grenzfall ändern, wenn die erste Zeile von regexp abgestimmt ist?

BTW sed '1,1d' funktioniert korrekt und entfernen Sie nur die erste Zeile.

+0

Sie einen Kommentar danken. Korrigiert und fügte einige andere Lösungen hinzu. – jm666

Antwort

14

versuchen, diese (GNU sed only):

sed '0,/^bin$/d' 

..output ist:

 
$sed '0,/^bin$/d' file 
boot 
... 
sys 
tmp 
usr 
var 
vmlinuz 
+0

Dies scheint die beste Option zu sein. Ich habe deine vorherige Antwort gesehen, die besagt, dass sie für GNU sed funktioniert, jetzt hast du das entfernt. Ich benutze GNU sed, also ist das für mich die richtige Antwort, aber nur aus Neugier, wird es für nicht GNU sed funktionieren? – Fabio

+0

gibt es keinen GNU-spezifischen Befehl, es sollte funktionieren, erzählte mir mein Lehrbuch. – Endoro

+0

Es funktioniert nicht auf OS X sed, aber wie ich dir sagte, ich brauche es auf einem Gnu-System. – Fabio

11

Dieser sed Befehl werden alle Zeilen gedruckt werden nach und einschließlich der Übereinstimmungslinie:

sed -n '/^WHATEVER$/,$p' 

Der -n Schalter macht sed drucken nur wenn erzählt (p Befehl).

Wenn Sie nicht möchten, dass die passende Zeile schließen Sie sed sagen kann, von Anfang der Datei an die entsprechende Zeile zu löschen: (. Wir verwenden den d Befehl, die Zeilen löscht)

sed '1,/^WHATEVER$/d' 

versuchen

+0

Ich habe auch diese Option erkundet und ich kündige wegen der Aufnahme der passenden Zeile. Ich vermisste die Option "tail -n + 2". Das ist also auch gut. Vielen Dank. – Fabio

+0

Sie sparen meinen Tag. Sehr einfach zu verstehen und voll funktionsfähig. Sicherlich die beste Antwort, wenn passende Zeile enthalten sein sollte. – jmcollin92

4

können Sie auch mit:

awk '/searchname/{p=1;next}{if(p){print}}' 
Verwandte Themen