Thread RegEx mit bedingter Ersetzung (11 answers)
Opened by micha2 at 2023-07-09 13:44

micha2
 2023-07-09 20:49
#195129 #195129
User since
2023-07-09
6 Artikel
BenutzerIn
[default_avatar]
Wie meinst du das mit mehreren Zeilen so?:

Code: (dl )
1
2
3
4
5
6
#!/bin/bash

echo 'abbc' \
| perl -pe \
"s,b,{if (1) {\"<\"}; \">\"; if (0) {\"y\"}},ge"
# Ausgabe: a00c


> Was ist die Aufgabe
Das liefert als Ergebnis "a00c". Ich hätte gerne "a<><>c". Da ich es abstrakt formuliert habe, sind die verschiedenen Fälle nur durch `if (1) …` und `if (0) …` dargestellt. Natürlich steht für `if (1) …` sowas wie `if ($3) …` und der originale Match-Ausdruck ist komplizierter als `b` mit Grupierungen und Quantifizierern. Der Input ist ebenfalls komplizierter als `abbc`.


So sieht ein Teil meines Versuchs in der Version mit `print` aus. Ich möchte bestimmte Information aus einer WebSeite als Text extrahieren:

Code: (dl )
1
2
3
4
5
6
7
local n0="\s*?=\s*?(\"|')\s*"
cat "eineWebSeite.html" \
| perl -00pe \
"s,<link ([^>]*?rel$n0(.*?)\2)?([^>]*?title$n0(.*?)\5)?.*?(href$n0(.*?)\8).*?(/>|>(.*?)</link>|>([^<]*?)),\
{print \"~~~~~\$9\n\"; if (\$6) {print \"\t\$6\n\"}},ige"\
| perl -pe \
"s,^1+$,,g "


Die überflüssigen 1+ filtere ich mit dem Workaround `| perl -pe "s,^1+$,,g "` raus. Leider kommt a an die falsche Stelle <><>a statt davor a<><>. Ich denke, dass muss in Perl-RegEx auch „richtig“ – ohne Workaround – gehen. Sonst wäre Perl nicht Perl. So ist mein Vorurteil. Und ich hoffe hier Hilfe zu bekommen, d.h. Perl und seine RegEx besser kennen zu lernen. Das sind meine ersten Versuche mit Perl. Und mit RegEx habe ich auch noch wenig Erfahrung.
Last edited: 2023-07-09 22:55:36 +0200 (CEST)

View full thread RegEx mit bedingter Ersetzung