2013-06-21 20 views
5

Ich Parsing eine PHP-Datei und Wrapping-Funktion Prototyp-Elemente in HTML. Wenn es jedoch kaufmännische Und-Zeichen gibt, bricht es meinen Code.Sed und Awk Escaping Ampersands (&)

Eingang: function foo (&$var1, &$var2){...} // als String
gewünschte Ausgabe (in HTML): &$var1, &$var2// im Grunde genommen nur gibt die Variablen so, dass sie richtig in einem Browser

angezeigt

Gerade jetzt , Ich sende jede Variable in Awaks Sub-Methode , und dann zu sed.

sub(/^&/, "\\\&", param) #param is the variable of interest (e.g. &$var1) 

#Intermediate step in case it's relevant. The awk-processed elements 
#are sent to ${file}_param.txt. Each set of parameters are delimited by colons. 
param=$(cut -d: -f$counter ${file}_param.txt) 

#Replace some default text in template file with real stuff. 
sed -i "s|@PARAM|$param|1" "$base"_funct_def.txt 

Output Ich erhalte: Die Et-Zeichen interpretiert werden. Das gesamte Spiel ist ersetzt.

Problemisolierung: Mit den folgenden Schritten wird stattdessen 'g $ var1' im Browser angezeigt, wie ich es möchte. Allerdings versuche ich stattdessen eine "&" zu bekommen.

sub(/^&/, "g", param) 

Meine Versuche: verwendete ich drei Schrägstriche, weil ich dachte, es wäre awk zuerst in Prozess ‚\ &‘, die in sed zugeführt würde interpretieren ‚\ &‘ als wörtliche ‚&‘. Ich habe versucht, irgendwo von 1 bis 6 Backslashes, aber ohne Erfolg.

FRAGE: Wie kann ich die & entkommen?

Handbuch: http://www.staff.science.uu.nl/~oostr102/docs/nawk/nawk_92.html


Einige "meta"/Design Fragen über das, was ich versuche, (nicht erforderlich für Frage !!) zu tun
Ich habe Haufen PHP-Dateien, für die ich ein bisschen Dokumentation erstellen möchte (strukturiert wie Javadocs). Ich gehe durch und analysiere es mit Hilfe von REGEX und Shell-Skripten, so dass ich den Funktionsnamen, die Parameter und die zurückgegebenen Elemente auflisten kann. Bis jetzt hat REGEX ziemlich gut funktioniert, denke ich, aber ich habe viel darüber gelesen, dass REGEX nicht dafür verwendet werden sollte. Ich würde gerne irgendwelche Kommentare zu diesem Thema begrüßen (wie wird die Dokumentation normalerweise erstellt?). Danke Leute!

+0

Was param' tut '$ tatsächlich enthalten? Wenn die Befehle nicht sequenziell ausgeführt werden (z. B. wenn tatsächlich einige andere Codes dazwischen liegen), sollten Sie sie nicht in denselben Codeblock einfügen. Das ist irreführend. – doubleDown

+0

Entschuldigung wegen des irreführenden Teils. Das werde ich mir in Zukunft merken. $ param enthält ein Parameterelement. Zum Beispiel, wenn es eine Funktion gibt: 'function foo (& $ arg1, $ arg2)' $ param soll ''& $ arg1'' sein Gute Nachrichten allerdings: Ich habe eine Lösung gefunden. Bevor ich sed ausführte, vergewisserte ich mich, jedem '&' zu entkommen. Ich habe folgendes direkt nach der ersten Param-Zuweisung hinzugefügt: 'param = $ (echo $ param | sed 's |^& | \\ & | g')' Dies ist im Gegensatz zu dem Versuch, Dinge in awk zu verpacken Teil des Codes. – bobbyjoe93

Antwort

0

Ich glaube, HTML liest & als kaufmännisches Zeichen. In Ihrer awk-Skript können Sie verwenden:

sub(/^&/, "&", param) 

Das Dollarzeichen in param muss mit einem Backslash geschützt werden, z.B. & $ var muss als & \ $ var geschrieben werden, oder sed und awk versuchen, $ var als Variable zu erweitern.

+1

Leider glaube ich nicht, dass das das Problem ist. Ersetzen durch "& amp" wird weiterhin von awk und sed als REGEX '&' interpretiert, was das übereinstimmende Element in der Ausgabe dupliziert. (Ich habe versucht, was Sie vorgeschlagen, nur als eine Überprüfung der Gesundheit. Hat nicht geklappt.) – bobbyjoe93

+0

Ich änderte meine Antwort nach einigen Tests. Die unausgelösten Dollarzeichen scheinen das Problem zu verursachen. – gbrener

0

Mit zwei Backslashes (d. H. sub(/^&/, "\\&", param)) funktioniert für mich. Funktioniert es nicht für dich?

Es in the nawk manual dokumentiert bezeichnet Sie in Ihrer Frage:

Wie üblich einfügen einen umgekehrten Schrägstrich in der Zeichenfolge, müssen Sie zwei Schrägstriche schreiben. Daher schreiben `\\ &‚in einer String-Konstante ein Zeichen `& enthält‘

im Ersatz Auch Ihre sub() Funktion im Wesentlichen einen kaufmännische mit einem Et-Zeichen ersetzt. Vielleicht denkst du deshalb, dass es auch mit zwei Backslashes nicht funktioniert.

+0

Hat es funktioniert, nachdem die Ausgabe von sub an sed gesendet wurde? Ich denke, sub gibt ein Literal '&' aus, aber wenn es an sed übergeben wird, wird das '&' noch einmal interpretiert. Also versuche ich für sub, '\ &' auszugeben, so dass es im sed-Teil entwichen wird. – bobbyjoe93

0

sed Methode:

printf "%s\n" 'function foo (&$var1, &$var2){...}//as String' | 
sed -n '/function/{s/^.*(//;s/).*$//;p}' 

Ausgang:

&$var1, &$var2 

Oder wenn HTML-Code erforderlich ist, dass wie txt2html zu einem util passieren:

printf "%s\n" 'function foo (&$var1, &$var2){...}//as String' | 
sed -n '/function/{s/^.*(//;s/).*$//;p}' | txt2html 
Verwandte Themen