perl command line regex replace


aGeNET

Erfahrenes Mitglied
#1
Moin moin,

ich hoffe ich bin hier richtig gelandet, da ich von Shellscripten absolut keine Ahnung habe und mir die folgenden Codeteile im Netz zusammengesucht habe.

Ziel ist es per Shellbefehl rekursiv in allen Dateien per RegEx Daten umzuschreiben. Mit RegEx kenne ich mich eigentlich sehr gut aus und in meinem RegExTester funktioniert das auch alles - nur über das angedachte Shellscript verhält sich der RegEx sehr eigenartig und ich kann mir nicht erklären warum.

das "Shellscript":
Code:
#!/bin/bash
find . -type f -iname "*.php" -exec perl -i -pe 's/(?:[^_](strtoupper|substr)\([\$])/mb_\1/g' {} \;
Beispieldaten, die modifiziert werden sollen:
Code:
<?php
$string = 'hahaha';
echo "this is thisthingy ".strtoupper('hahaha')." the shell\n";
echo "this is thisthingy ".strtoupper($string)." the ".mb_strtoupper('hohoho')." shell\n";
?>
<script type="text/javascript">
var test = document.getElementbyId('id').substr(5);
</script>
Wenn ich das Shellscript ausführe kommt statt dem erwarteten
Code:
... thisthingy ".mb_strtoupper($string)." the ...
aber folgendes raus
Code:
... thisthingy "mb_strtoupperstring)." the ...
Ich hoffe, mir kann geholfen werden.

mfg aGeNET
 

deepthroat

Erfahrenes Mitglied
#2
Hi.

Dein reg. Ausdruck ist falsch. Du hast das erste Zeichen vor und das letzte Zeichen nach <Funktionsname><Klammer-auf> aus dem String entfernt. Vielleicht stimmt da mit deinem Regex Tester etwas nicht...

Eine Möglichkeit wäre Look-Around Assertions zu verwenden:

Code:
(?<!_)(strtoupper|substr)(?=\([\$])
Gruß
 
Zuletzt bearbeitet:

aGeNET

Erfahrenes Mitglied
#3
Danke, das hat funktioniert. Dann sag ich mal böser RegExTester.
Gut der kann halt nur die matching-Funktion und kein replace aber trotzdem war dort das erwartete Resultat korrekt.

Zu Anfang hatte ich mit sed herumexperimentiert und musste feststellen, dass dort keine Look-Arounds möglich waren und habe dann andere Wege gesucht. Nach dem Wechsel zur perl-Variante habe ich aber die Look-Arounds beschämenderweise wieder vergessen.
 

Neue Beiträge