rekursives Suchen&Ersetzen mit sed - "quote >"?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
CrimsonKing
Beiträge: 106
Registriert: 30.08.2009 08:08:53
Lizenz eigener Beiträge: Artistic Lizenz

rekursives Suchen&Ersetzen mit sed - "quote >"?

Beitrag von CrimsonKing » 28.11.2012 18:32:38

Ich würde gern auf dieser Seite rekursiv - also auch in jedem Unterverzeichnis - jedes Vorkommen von

Code: Alles auswählen

<?php include($_SERVER['DOCUMENT_ROOT']  . "/projects/vim/_build.php"); ?>
(bisher hardcodiertes "Build-Datum") ersetzen durch

Code: Alles auswählen

<?php echo date("Y-m-d", filectime($_SERVER['DOCUMENT_ROOT']  . "/projects/vim/complete.7z")); ?>
, um mir etwas Aufwand nach einem Update zu sparen und nur noch die Versionsnummer (steht, weil sie an verschiedenen Stellen verwendet wird, in der _version.php) händisch aktualisieren zu müssen.

Ich dachte, mit sed ginge das am einfachsten.

Code: Alles auswählen

 find ./ -type f -exec sed -i 's/include\(\$_SERVER\[\'DOCUMENT_ROOT\'\]  . "\/projects\/vim\/_build.php"\)/echo date("Y-m-d", filectime($_SERVER['DOCUMENT_ROOT']  . "/projects/vim/complete.7z"))/' {} \;
Das führt nicht zum gewünschten Erfolg. Der Prompt antwortet:

Code: Alles auswählen

quote>
Wo liegt der Fehler?

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: rekursives Suchen&Ersetzen mit sed - "quote >"?

Beitrag von Cae » 28.11.2012 18:48:52

Das dritte Tick ist escaped, daher wird es von der Shell nicht als Anfang eines Strings wahrgenommen. Das zweite beendet aber den String des ersten Ticks und ist damit "vergeben". D.h. du hast aus der Sicht der Shell einen Anfuehrungsstrich zu wenig, eben ein quote. Zu den Ticks hatte ich erst kuerzlich [1] etwas geschrieben.

Zur Verdeutlichung:

Code: Alles auswählen

's/include\(\$_SERVER\[\'DOCUMENT_ROOT\'\]  . "\/projects\/vim\/_build.php"\)/
<00000000000000000000000>.....................<111111111111111111111111111>...

echo date("Y-m-d", filectime($_SERVER['DOCUMENT_ROOT']  . "/projects/vim/complete.7z"))/'
..........<22222>.....................<3333333333333>.....<4444444444444444444444444>...?
Die Punkte sind "normaler Text", der interpretiert wird (da sind auch Klammern und Variablen drin, das ist zusaetzlich falsch). Die Ziffern stehen fuer die String-Inhalte, <> fuer die Begrenzer. Wie du siehst, folgt nach String 4 ein nicht terminierter Tick.

Gruss Cae

[1] viewtopic.php?f=27&t=139560
Zuletzt geändert von Cae am 28.11.2012 18:57:52, insgesamt 1-mal geändert.
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

CrimsonKing
Beiträge: 106
Registriert: 30.08.2009 08:08:53
Lizenz eigener Beiträge: Artistic Lizenz

Re: rekursives Suchen&Ersetzen mit sed - "quote >"?

Beitrag von CrimsonKing » 28.11.2012 18:53:41

Von der Logik her passt es doch? Ich übergebe sed den kompletten String vom 1. bis zum letzten ' als Parameter...?

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: rekursives Suchen&Ersetzen mit sed - "quote >"?

Beitrag von Cae » 28.11.2012 18:58:57

Bitte nochmal oben gucken, ich hatte zwischenzeitlich den zweiten Absatz geschrieben, aber erst nach deinem Post hineineditiert.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

CrimsonKing
Beiträge: 106
Registriert: 30.08.2009 08:08:53
Lizenz eigener Beiträge: Artistic Lizenz

Re: rekursives Suchen&Ersetzen mit sed - "quote >"?

Beitrag von CrimsonKing » 28.11.2012 19:02:27

Der "nicht terminierte Tick" soll ja auch nicht terminiert werden. sed braucht den doch als Ende des Ausdrucks, dachte ich?

Termination löst allerdings das Problem auch nicht.
% find ./ -type f -exec sed -i 's/include\(\$_SERVER\[\'DOCUMENT_ROOT\'\] . "\/projects\/vim\/_build.php"\)/echo date("Y-m-d", filectime($_SERVER['DOCUMENT_ROOT'] . "/projects/vim/complete.7z"))/\' {} \;
zsh: bad math expression: operand expected at `'DOCUMENT_...'
8O

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: rekursives Suchen&Ersetzen mit sed - "quote >"?

Beitrag von Cae » 28.11.2012 19:11:14

Oben am Bild muesste der 00000-String bis an's Ende der letzten Zeile reichen, damit es richtig waere. Du kannst keine (escapten oder nicht escapten) Ticks mittendrin verwenden, sie beenden immer den aeusseren String. Deswegen hatte ich ja den anderen Thread verlinkt, du musst genauso wie dort '...'...' durch '...'\''...' ersetzen. Fuer alle Ticks im "Inneren".

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

CrimsonKing
Beiträge: 106
Registriert: 30.08.2009 08:08:53
Lizenz eigener Beiträge: Artistic Lizenz

Re: rekursives Suchen&Ersetzen mit sed - "quote >"?

Beitrag von CrimsonKing » 28.11.2012 19:21:14

Ah, ich verstehe, danke. Allerdings scheine ich noch etwas übersehen zu haben.

Code: Alles auswählen

% find ./ -type f -exec sed -i 's/include\(\$_SERVER\['\''DOCUMENT_ROOT'\''\]  . "\/projects\/vim\/_build.php"\)/echo date("Y-m-d", filectime($_SERVER['\''DOCUMENT_ROOT'\'']  . "/projects/vim/complete.7z"))/' {} \;

sed: -e expression #1, char 137: unknown option to `s'
sed: -e expression #1, char 137: unknown option to `s'
sed: -e expression #1, char 137: unknown option to `s'
sed: -e expression #1, char 137: unknown option to `s'
sed: -e expression #1, char 137: unknown option to `s'
sed: -e expression #1, char 137: unknown option to `s'
sed: -e expression #1, char 137: unknown option to `s'
sed: -e expression #1, char 137: unknown option to `s'
sed: -e expression #1, char 137: unknown option to `s'
sed: -e expression #1, char 137: unknown option to `s'
sed: -e expression #1, char 137: unknown option to `s'
sed: -e expression #1, char 137: unknown option to `s'
sed: -e expression #1, char 137: unknown option to `s'
sed: -e expression #1, char 137: unknown option to `s'
sed: -e expression #1, char 137: unknown option to `s'
sed: -e expression #1, char 137: unknown option to `s'
...

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: rekursives Suchen&Ersetzen mit sed - "quote >"?

Beitrag von Cae » 28.11.2012 19:25:56

Ja, hast du. Die Slashes / (und evtl. Klammern) im b-Teil vom s/a/b/c sind nicht mit einem Backslash \ escapt, wie es vorne im a-Teil schon ist. Sonst seh' ich erstmal nix.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

CrimsonKing
Beiträge: 106
Registriert: 30.08.2009 08:08:53
Lizenz eigener Beiträge: Artistic Lizenz

Re: rekursives Suchen&Ersetzen mit sed - "quote >"?

Beitrag von CrimsonKing » 28.11.2012 19:51:12

Aaahhhh... mein Fehler. :)
Ich arbeite zu oft mit verschiedenen PCRE-fähigen Programmen, manche hätten gern Escapes im Ersetzen-Teil, manche reagieren allergisch darauf. Das war ein nachlässiger Fehler von mir. Danke!

Also:

Code: Alles auswählen

find ./ -type f -exec sed -i 's/include\(\$_SERVER\['\''DOCUMENT_ROOT'\''\]  . "\/projects\/vim\/_build.php"\)/echo date\("Y-m-d", filectime\($_SERVER\['\''DOCUMENT_ROOT'\''\]  . "\/projects\/vim\/complete.7z"\)\)/' {} \;
So? :)

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: rekursives Suchen&Ersetzen mit sed - "quote >"?

Beitrag von Cae » 28.11.2012 19:59:23

Probier's aus... da wird man doch vom Lesen bescheuert von... :wink: :roll: :mrgreen:

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

CrimsonKing
Beiträge: 106
Registriert: 30.08.2009 08:08:53
Lizenz eigener Beiträge: Artistic Lizenz

Re: rekursives Suchen&Ersetzen mit sed - "quote >"?

Beitrag von CrimsonKing » 28.11.2012 21:12:13

Der Befehl scheint nichts zu tun.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: rekursives Suchen&Ersetzen mit sed - "quote >"?

Beitrag von Cae » 28.11.2012 21:39:57

Code: Alles auswählen

$ echo '<?php echo date("Y-m-d", filectime($_SERVER['DOCUMENT_ROOT']  . "/projects/vim/complete.7z")); ?>' | sed 's/include($_SERVER\['\''DOCUMENT_ROOT'\'']  . "\/projects\/vim\/_build.php")/echo date("Y-m-d", filectime($_SERVER['\''DOCUMENT_ROOT'\'']  . "\/projects\/vim\/complete.7z"))/'
<?php echo date("Y-m-d", filectime($_SERVER[DOCUMENT_ROOT]  . "/projects/vim/complete.7z")); ?>
Also werden die Klammern []() nicht escaped. Oben sind sie es noch und das gibt dann die logische Wirkung wie bei (Bananen|Vanille)eis.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

CrimsonKing
Beiträge: 106
Registriert: 30.08.2009 08:08:53
Lizenz eigener Beiträge: Artistic Lizenz

Re: rekursives Suchen&Ersetzen mit sed - "quote >"?

Beitrag von CrimsonKing » 28.11.2012 21:56:16

Hm, aber ich habe doch überall einen Backslash gesetzt? :?

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: rekursives Suchen&Ersetzen mit sed - "quote >"?

Beitrag von Cae » 28.11.2012 22:08:31

CrimsonKing hat geschrieben:Hm, aber ich habe doch überall einen Backslash gesetzt? :?
Ja, genau das ist jetzt das Problem, weil die Klammern eine spezielle Bedeutung bekommen. Die sollen sie hier aber gar nicht haben. Oben hatte ich
Cae hat geschrieben:Slashes / (und evtl. Klammern)
eher als Ueberlegung geschrieben, es trifft naemlich nicht zu. Hier jedenfalls nicht [1]. Die Shell interpretiert hier nichts, das man normalerweise dagegen schuetzen muesste, weil alles in den aeusseren Ticks steht. Daher braucht es bei den Klammern keine Sonderbehandlung.

Gruss Cae

[1] Hier schon:

Code: Alles auswählen

$ echo (test)
sh: 1: Syntax error: word unexpected (expecting ")")
$ echo \(test\)
(test)
$ echo '(test\)' # *hier* ist egal, was in den Ticks steht. Diesen Fall haben wir oben.
(test\)
$ 
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

CrimsonKing
Beiträge: 106
Registriert: 30.08.2009 08:08:53
Lizenz eigener Beiträge: Artistic Lizenz

Re: rekursives Suchen&Ersetzen mit sed - "quote >"?

Beitrag von CrimsonKing » 28.11.2012 22:21:57

Ah. Also neue Regel gelernt: sed möchte kein korrektes PCRE haben. Danke.

Code: Alles auswählen

% find ./ -type f -exec sed -i 's/include($_SERVER['\''DOCUMENT_ROOT'\'']  . "\/projects\/vim\/_build.php")/echo date("Y-m-d", filectime($_SERVER\['\''DOCUMENT_ROOT'\'']  . "\/projects\/vim\/complete.7z"))/' {} \;
Hat keinen Fehler ausgegeben, jedoch auch nichts ersetzt.

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: rekursives Suchen&Ersetzen mit sed - "quote >"?

Beitrag von Meillo » 28.11.2012 22:58:37

CrimsonKing hat geschrieben: Also neue Regel gelernt: sed möchte kein korrektes PCRE haben.
Genau! Und der Grund ist, dass sed viel aelter als Perl ist, nach dem die ``Perl Compatible Regular Expressions'' benannt sind. ;-)
Use ed once in a while!

CrimsonKing
Beiträge: 106
Registriert: 30.08.2009 08:08:53
Lizenz eigener Beiträge: Artistic Lizenz

Re: rekursives Suchen&Ersetzen mit sed - "quote >"?

Beitrag von CrimsonKing » 28.11.2012 22:59:53

Das hat nichts zu sagen. Software wird manchmal angepasst. :D

Antworten