2017-04-02 8 views
2

Zuerst, Entschuldigung für die potenziell doppelte Frage. Ich bin neu im Bash-Scripting und kann nicht einmal ein paar Schlüsselwörter herausfinden. Mit dieser sagte, habe ich versucht, die Problembeschreibung zu vereinfachen, so viel wie ich kann:Awk, Gsub, Et-Zeichen und unerwartete Erweiterung

ich eine Textdatei (test.txt), die nur diese Zeile enthält:

REPLACE 

ich den folgenden Befehl lief das ist soll den Text der Datei ersetzen (zB REPLACE) mit Code-Variablenwert if (A & B).

code="if (A & B)" ; awk -v var="${code}" '{ gsub(/REPLACE/, var); print }' test.txt 

Erwarteter Ausgang I erwarten code Variablenwert gedruckt werden wie:

if (A & B) 

Actual Ausgang irgendwie das Und-Zeichen in 'ersetzen' erweitert wird, was gsub regexp Parameter ist:

if (A REPLACE B) 

Vielleicht muss ich den Amp entkommen ersand aber leider code Variable Population ist außerhalb meiner Kontrolle, so kann ich seinen Wert nicht manuell manipulieren.

FYI awk-Version ist "GNU Awk 4.1.4, API: 1.1 (Mpfr 3.1.5, GNU MP 6.1.2)"

Dank!

+1

'&' bedeutet „Ersatz full match "in awk regexes, einschließlich gsub. Sie müssen es entkommen: 'code =" if (A \\ & B) "' (ja, mit zwei baclslashes, weil die Shell auch ihre Erweiterung tut) – grochmal

Antwort

2

& ist ein Rückverweis Metazeichen in vielen Tools und es bedeutet "die Zeichenfolge, die die Regexp, die Sie gesucht haben". Wenn Sie versuchen, Literalzeichenfolgen zu verwenden, verwenden Sie stattdessen Literalzeichenfolgen anstelle von Regexps und Rückwärtsreferenzen.

zB:

code="if (A & B)" 
awk -v old="REPLACE" -v new="$code" 's=index($0,old){$0=substr($0,1,s-1) new substr($0,s+length(old))} 1' test.txt 

Die Alternative, versuchen regexps und Ersatz santize, ist kompliziert und fehleranfällig und ist in der Regel nicht für schwache Nerven, siehe: Is it possible to escape regex metacharacters reliably with sed

+1

Danke, Ed! Das von Ihnen angegebene Beispiel funktioniert einwandfrei. – Remon

+1

hah! keine Notwendigkeit zu warten. Danke für die Erinnerung;) – Remon

+1

Hi Ed, dieser Code hat mir sehr geholfen, ich hatte Probleme beim Implementieren einer Template-Engine in awk mit gsub, weil das kaufmännische Und. Ich wünschte, es gäbe eine Möglichkeit, es zu deaktivieren. Aber deine Lösung hat wie ein Traum funktioniert. Vielen Dank! – valrog

Verwandte Themen