Verwenden von sed zum Entfernen von Zeilen in einer Datei

2086
eleven81

Ich habe eine Datei, die ungefähr so ​​aussieht:

Heading -  - Completed foo - More information - Still more * Need to complete bar - Did baz (comment blah blah) ***  Another -  * Need to complete foo - Completed bar (blah comment blah) *** - Done baz 

Ich muss die Textdatei durchlaufen sed, um alle Zeilen zu entfernen, die mit Leerzeichen (die Anzahl variiert) und einem Bindestrich und einem anderen Leerzeichen beginnen.

Was ist der Regex oder das Muster, das ich verwenden muss sed, damit die Ausgabe wie folgt aussieht?

Heading -  * Need to complete bar  Another -  * Need to complete foo 
1

4 Antworten auf die Frage

3
eleven81

Ich habe die Antwort von Phoshi mit Hilfe von Dennis Williamson verwendet, um mir dabei zu helfen, herauszufinden, sed /^\s+-\s.*/dwas wie erwartet funktioniert.

Sie können anstelle von "*" auch "+" verwenden, um sicherzustellen, dass mindestens ein Leerzeichen vorhanden ist. Dennis Williamson vor 14 Jahren 0
2
Phoshi

"s/\s*-\s.*//g" sollte es tun, denke ich.

Dies entspricht einem Leerzeichen, * einem Nullpunkt oder mehr des vorangehenden Zeichens (dem Leerzeichen), einem wörtlichen Bindestrich, einem weiteren Leerzeichen und dann. +, Um alles danach zu finden.

Schließen. Sehr nah! Das hinterlässt leere Zeilen. Der Wagenrücklauf / Zeilenvorschub wird nicht entfernt. eleven81 vor 14 Jahren 0
Verdammt! Versuchen Sie, ein \ s an die Suchzeichenfolge anzuhängen. Dann mache ich leider nicht genug Arbeit an ganzen Zeilen: P Phoshi vor 14 Jahren 0
1

Sie sollten egrep oder grep für diese Aufgabe verwenden. Sed ist ein Stream-Editor. Grep entspricht eher der Philosophie der einzelnen Linien.

Sie benötigen einen regulären Ausdruck, der dem Zeilenanfang, Leerzeichen, Bindestrich und Leerzeichen entspricht. Das hört sich so an:

egrep -v '^[ ]+-[ ]' filename 

Die -vOption bewirkt, dass egrep die übereinstimmenden Zeilen ENTFERNT. Dies ist einfacher als das Erstellen eines regulären Ausdrucks, der die Zeilen zurückweist.

Beispiel:

 nobody$ egrep -v '^[ ]+-[ ]' /tmp/foof Heading -  * Need to complete bar  Another -  * Need to complete foo nobody$ cat /tmp/foof Heading -  - Completed foo - More information - Still more * Need to complete bar - Did baz (comment blah blah) ***  Another -  * Need to complete foo - Completed bar (blah comment blah) *** - Done baz nobody$ _ 

Der Umgang mit Tab-Zeichen bedeutet nur, dass Sie sie in den Klammerausdrücken benötigen, aber das lässt sich online nur schwer anzeigen.

Mit Registerkarten: `egrep -v $ '^ [\ t] + - [\ t]' / tmp / foof` Dennis Williamson vor 14 Jahren 0
0
Ryan Thompson

Für das Filtern ganzer Zeilen aus der Ausgabe möchten Sie normalerweise grepnicht sed. Um bestimmte Zeilen auszuschließen, sollten Sie diese verwenden grep -v 'exclusion-regex'.

Ich sehe nicht _why_ one _wants_ 'grep' anstelle von 'sed' .. mit Ausnahme komplexerer Syntax. Warum ist die Verwendung von grep zum Herausfiltern von Dingen besser als der Befehl 'd' von 'sed'? akira vor 14 Jahren 1