Ich möchte die Zeile 4598 in der folgenden Datei anzeigen. Eigentlich möchte ich die Zeile NACH dem n-ten Auftreten einer Übereinstimmung anzeigen. In diesem Fall ist die Zeile nach dem 3. Auftreten von <Car>
. Wie gehe ich vor?
<Car>
10456
</Car>
<Car>
70192
</Car>
<Car>
4598
</Car>
sed
,awk
oder sogargrep
, ist es ratsam , die Verwendung eines XML - Parser zu machen.Antworten:
Oder:
So übergeben Sie das Suchmuster als Variable:
Hier werden Backslash-Escape-Sequenzen
ENVIRON
anstelle von-v
as-v
verwendet, und Backslashes werden häufig in regulären Ausdrücken gefunden (müssten also verdoppelt werden-v
).Mit GNU
awk
4.2 oder höher können Sie Variablen als stark typisierte reguläre Ausdrücke zuweisen . Solange der POSIX-Modus nicht aktiviert ist (z. B. über die$POSIXLY_CORRECT
Umgebungsvariable), können Sie Folgendes tun:quelle
Hier ist ein Perl:
Mit GNU
grep
können Sie die Ausgabe auch wie folgt analysieren:Von
man grep
:quelle
Mit können
GNU awk
Sie tun:quelle
Hier ist ein anderer Weg mit
sed
:Dies verwendet den Haltebereich zum Zählen.
Jedes Mal , trifft es auf eine Leitungsanpassung
<Car>
ëx
Änderungen Puffer und überprüft , ob es genau ist N-1 Vorkommen eines Zeichens in dem Haltepuffer. Wenn die Prüfung erfolgreich ist,x
ändert sie sich erneut, und wenn sie nicht in der letzten Zeile steht, zieht sie dien
ext-Zeile ein undp
druckt den Musterbereich dannq
aus. Andernfalls wird dem Haltebereich nur ein weiteres.
Zeichen hinzugefügt, und ex
wechselt zurück.quelle
Hier ist eine einfache Befehlszeilenlösung.
Wenn Sie den Wert von +3 danach ändern
tail
, können Sie eine beliebige n-te Zeile angeben.quelle