sed - So entfernen Sie alle nicht übereinstimmenden Zeilen

12

Ich habe eine HTML-Datei. Ich möchte alle Zeilen entfernen, die nicht mit beginnen <tr>.

Ich habe es versucht:

cat my_file | sed $'
s/^[^tr].*//
' | sed '/^$/d'

aber es löschte alle Zeilen.

Michael Durrant
quelle
3
Einfacher mit grep.
Jcbermu
1
s/^[^tr]...stimmt mit Zeilen überein, die mit einem anderen Zeichen als toder beginnen r. Eckige Klammern sind ein Zeichenbereich in einem regulären Ausdruck.
Peter Cordes

Antworten:

18

Versuchen Sie dies mit GNU sed:

sed -n '/^<tr>/p' file

oder

sed '/^<tr>/!d' file
Cyrus
quelle
1
Ich finde die Version mit !dbesonders nützlich, weil Sie damit einen anderen sed-Befehl in den Ausdruck schreiben können, während der peinzige die Übereinstimmung druckt, der nächste Befehl jedoch die Eingabe nicht geändert hat.
Jirislav
9
sed -e '/^<tr>/d'

Der Teil dazwischen /ist ein regulärer Ausdruck. Der dBefehl löscht übereinstimmende Zeilen.

Update: Ups, tut mir leid, ich habe gesehen, dass du NICHT gesagt hast. Damit

sed -e '/^<tr>/!d'

Wo !negiert der Sinn des Spiels.

user3188445
quelle
3

Wenn es sein muss sed:

sed -ni '/^<tr>/p' file

-iBearbeitet die Datei an Ort und Stelle, -nverhindert , dass sedalle Zeilen gedruckt werden. Der reguläre Ausdruck bedeutet , dass alle Zeilen, ^mit <tr>denen begin ( p) beginnt, übereinstimmen und diese Zeilen gedruckt werden ( ).

Mit grep:

grep -E '^<tr>' file

Mit -Egrep interpretiert erweiterte reguläre Ausdrücke.

Mit awk:

awk '/^<tr>/' file

Oder rein bash:

while IFS= read -r l; do [[ "$l" =~ ^\<tr\> ]] && echo $l; done <file

Der [[is bashs interne bedingte Ausdruck. Wir vergleichen $lmit dem regulären Ausdruck und wenn es erfolgreich ist ( &&), drucken wir die Zeile mit echo.

Chaos
quelle
Ihre Pure-Bash-Version zitiert nicht "$l". Und Sie setzen es als erstes Argument in echodie Befehlszeile, sodass Sie ein Problem haben, wenn es mit a beginnt -option. (Verwenden Sie printf '%s\n' "$l"). Also, shell read` muss jeweils ein Byte lesen, daher ist es sehr langsam. Die Verarbeitung von Textdateien in reiner Bash ist normalerweise keine gute Wahl, es sei denn, Sie wissen, dass Ihre Datei sehr klein ist.
Peter Cordes
2

Die einfachste und einfachste Antwort wäre:

grep '^<tr>' path/to/file 

Dadurch wird die Datei nur mit den Zeilen ausgedruckt, die beginnen. Dies kann hilfreich sein, wenn Sie die Datei nicht direkt ändern möchten (wie bei sed).

Wenn Ihnen das gefällt, was Sie in der Ausgabe sehen, können Sie es einfach in eine Datei mit ausdrucken > file

In diesem Fall sparen Sie einige Zeit beim Sichern Ihrer Datei, bevor Sie einige Befehle ausführen.

VaTo
quelle