.png)
Ich versuche in einem meiner Projekte allemysql zu mysqli, mit ihren Parametern. Dazu suche ich rekursiv nach allen Dateien mit mysql in meinem Ordner und ersetze sie durch mysqli.
Ex:
mysql_query($query) zu mysqli_query($link, $query)
Ich kann alles erfassen (laut Regex-Tester), aber nichts scheint ersetzt worden zu sein und es treten auch keine Fehler auf.
grep -rl mysql PROJECTFILE | xargs sed -ri "s/(mysql_query)\(\$([\w-]+)\)/WhatIWant/g"
Ich habe über Backslashes gelesen insedaber ich habe es nicht ganz verstanden; die Ausgabe enthält keine Fehler, aber die Datei bleibt gleich. Wenn ich nur anhand eines Beispiels oder einer Erklärung erfahren könnte, was fehlt, wäre das perfekt.
Es ist einfach, mysql durch mysqli zu ersetzen, aber es wäre schön, alles auf einmal zu tun. Ich verwende eine temporäre Datei, um sicherzustellen, dass es funktioniert, bevor ich es in meinem Projekt ausprobieren kann.
Danke.
BEARBEITEN: Ich weiß, wenn ich alles auf einmal machen will, muss ich erfassenMySQLallein und fügen Sie eineich, aber das war nur so eine Idee.
Für Tedron wäre meine gewünschte Ausgabe ungefähr so.
sed -ri "s/(mysql_query)\(\$([\w-]+)\)/mysqli_query($link, \2)/g" filename
Glenn schlug eine Lösung ohne Erfassung vor. Wenn ich jedoch ändern möchtemysql_fetch_array($Abfrage), dann muss ich möglicherweise Regex verwenden, um den ersten Parameter beizubehalten und anzuhängenMYSQLI_BOTHZum Beispiel.
LÖSUNG:
Dank Tedron konnte ich mein Problem auf meine Weise lösen:
sed -ri 's/(mysql)_query\((\$[a-zA-Z_-]+)\)/\1i_query($link, \2)/' filename
Und für mysqli_fetch_array:
sed -ri 's/(mysql)(_fetch_array)\((\$[a-zA-Z_-]+)\)/\1i\2(\3, MYSQLI_BOTH)/' filename
Verwenden Sie dies, grep
wie ich es in meiner Frage getan habe, um ein Verzeichnis sofort zu ändern.
Antwort1
Sie müssen nichts erfassen:
sed 's/mysql_query(/mysqli_query($link, /g' file
Verwenden Sie es nicht -i
während des Tests, sondern fügen Sie es hinzu, wenn Sie mit den Ergebnissen zufrieden sind.
Antwort2
Noch eine weitere Möglichkeit mit erweitertem regulären Ausdruck ( -r
):
sed -r 's/(mysql)(_query\()/\1i\2$link,/g'
Antwort3
Sie benötigen keine Erfassungsgruppe um mysql_query
, da Sie diese nicht in den Ersatz kopieren. Sie müssen nur das Abfrageargument erfassen, da dies bei jedem Aufruf unterschiedlich ist.
sed -ri 's/mysql_query\s*\((\$\w+)\)/mysqli_query($link, \1)/g'
Antwort4
Das Problem ist das \w
. Ich habe das erst selbst herausgefunden, als ich versuchte herauszufinden, was hier vor sich geht, aber anscheinend können Dinge wie \s
oder \w
, die bereits Zeichenklassen sind, nicht innerhalb anderer Zeichenklassen mit ERE verwendet werden (mit PCREs schon). Zur Veranschaulichung:
$ echo foo- | sed -r 's/[\w-]+/bar/'
foobar
$ echo 'w\-foo' | sed -r 's/[\w-]+/bar/'
barfoo
$ echo foo- | sed -r 's/\w+/bar/'
bar-
[ ]
Daher werden die Zeichen-Escape-Klassen innerhalb einer Zeichenklasse als Literalzeichen behandelt . Der Ausdruck [\w-]
bedeutet „entspricht einem der folgenden Zeichen \
, w
oder -
. “
Damit Ihr regulärer Ausdruck funktioniert, verwenden Sie entweder [a-zA-z_]
anstelle von \w
oder Gruppierungsklammern:
$ echo 'mysql_query($query)' |
sed -r 's/mysql_query\(\$(\w|-)+\)/WhatIWant/'
WhatIWant
Konkret zu Deinem Beispiel:
$ echo 'mysql_query($query)' |
sed -r 's/(mysql_query)\((\$[a-zA-Z_-]+)\)/\1($link,\2)/'
mysql_query($link,$query)