Perl: suchen ersetzen in HTML-Dokument

moonwalker99

Lt. Commander
Registriert
Jan. 2008
Beiträge
1.850
Mit dem Perl-Befehl

Code:
perl -p0777e 's#<mytag.*?</mytag>##gsi'

kann ich aus einem HTML-Dokument die gefundenen Teile löschen, auch wenn sie Zeilenumbrüche enthalten. Jetzt würde ich gern das Komplement davon bilden, d.h. nur die gefundenen Teile sollen erhalten bleiben, der Rest soll gelöscht werden.

Ich kenne mich mit perl nicht so gut aus. Unter Linux würde ich mit grep arbeiten, was kann man bei Perl machen? Bin für jeden Tipp dankbar.
 
Bin kein regex-Mensch, aber du kannst gefundene Teile in der Ersetzung wiederverwenden ("capture groups" heißt das glaube ich im regex Jargon). Entsprechend könntest du das Gefundene in einer capture group packen und in der Ersetzung wieder einsetzen. Damit fällt alles andere weg. Ob das in deinem Fall wirklich funktioniert und ob es da nicht doch was schickeres gibt, keine Ahnung.

PS: Das hat an sich nichts mit Perl zu tun. Was du da machst ist, Perl dazu zu benutzen, einen regex anzuwenden. Das sollte auch grundsätzlich auf der Shell z.B. mit sed funktionieren.
 
perl -n0777e 'END{print join "\n",@F} @F=m{<mytag.*?</mytag>}gsi'

/Edit: Um das mal für die nicht-Perlisten zu erklären:

@F = m{<mytag.*?</mytag>}gsi - führt einen Match auf den Tag <mytag> bis zum nächsten (wegen nongreedy .*?) vorhandenen </mytag> durch (wegen /s) über Zeilenwechsel hinweg) und liefert (wegen /g) eine Liste aller Matches (an das Array @F)

END{print join "\n",@F} - wartet bis zum Ende des Perl-Kommandozeilenbefehls und gibt das in @F gefundene Resultat durch Newline "\n" getrennt aus.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: FeelsGoodManJPG und moonwalker99
Sehr gut!!! Danke!

perl ist wirklich mächtig, von mächtiger als andere Linux-Befehle. Das erspart mir eine Menge Arbeit.
Ergänzung ()

Weitere Frage: kann ich einen weiteren Match dem Array @F hinzufügen? Z.B. erst <title>.*</title> und dann o.g. mytag-Match?
 
Zuletzt bearbeitet:
"Lookaround" sollte dir helfen können:
https://www.regular-expressions.info/lookaround.html
In der Art von: <(?!(\bmytag\b))\w+.*?</(?!(\bmytag\b))\w+>
Das funktioniert jedoch nur dann, wenn die mytag-Tags nicht genestet sind!
Für Nested mytag-Tags müsste man noch etwas mehr Gedanken einfließen lassen.
U.U. könnte es aber schon reichen aus dem .*? ein [^<]*? zu machen. (Dann darf aber ein mytag-Tag selber nicht andere Tags nesten, sonst funktioniert diese Lösung wieder nicht.)
 
Zuletzt bearbeitet:
Beispiel mit <h2> und <h3>:

perl -n0777e 'END{print join "\n",@F} @F=(m{<h3.*?</h3>}gsi,m{<h2.*?</h2>}gsi)'

also nach dem Schema: @F = ( m{ } , m{ } )
 
  • Gefällt mir
Reaktionen: moonwalker99
Zurück
Oben