Perl: suchen ersetzen in HTML-Dokument

moonwalker99

Lt. Commander
Dabei seit
Jan. 2008
Beiträge
1.379
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.
 

KillerCow

Lt. Commander
Dabei seit
Jan. 2012
Beiträge
1.278
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.
 

blöderidiot

Captain
Dabei seit
Juni 2004
Beiträge
3.605
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:

moonwalker99

Lt. Commander
Ersteller dieses Themas
Dabei seit
Jan. 2008
Beiträge
1.379
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:

AW4

Ensign
Dabei seit
März 2005
Beiträge
183
"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:

blöderidiot

Captain
Dabei seit
Juni 2004
Beiträge
3.605
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{ } )
 
Top