2017-04-02 2 views
2

Tout d'abord, excuses pour la question potentiellement en double. Je suis nouveau à bash scripting et je n'arrive même pas à trouver des mots-clés avec lesquels faire des recherches. Cela dit, j'ai essayé de simplifier la description du problème, autant que je peux:Awk, gsub, ampersands et expansion inattendue

J'ai un fichier texte (test.txt) qui ne contient que cette ligne:

REPLACE 

j'ai couru la commande suivante qui est supposé remplacer le texte du fichier (par exemple REPLACE) avec la valeur de la variable de code if (A & B).

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

sortie Expected Je me attends code valeur de la variable à imprimer comme est:

if (A & B) 

La production réelle en quelque sorte l'esperluette est copié dans 'REPLACE', qui est le paramètre gsub regexp:

if (A REPLACE B) 

Peut-être que j'ai besoin d'échapper à l'ampli ersand malheureusement, code population variable est hors de mon contrôle, donc je ne peux pas manipuler sa valeur manuellement.

Pour votre information awk version est "GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.5, GNU MP 6.1.2)"

Merci!

+1

'et' signifie « remplacer match complet "dans awg regexes, y compris gsub. Vous devez lui échapper: 'code =" if (A \\ & B) "' (oui, avec deux baclslashes, car le shell fait aussi son expansion) – grochmal

Répondre

2

& est un métacaractère de référence arrière dans de nombreux outils et cela signifie "la chaîne qui correspond à l'expression rationnelle que vous avez recherchée". Si vous essayez d'utiliser des chaînes littérales, utilisez des chaînes littérales au lieu des expressions rationnelles et des références arrières.

par exemple:

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 

L'alternative, en essayant de santize regexps et les remplacements, est complexe et sujette aux erreurs et est généralement pas pour les faibles de cœur, voir: Is it possible to escape regex metacharacters reliably with sed

+1

Merci, Ed! L'exemple que vous avez fourni fonctionne parfaitement. – Remon

+1

hah! pas besoin d'attendre. Merci pour le rappel;) – Remon

+1

Salut Ed, ce code m'a beaucoup aidé, j'avais des problèmes pour implémenter un moteur de template dans awk en utilisant gsub, parce que l'esperluette. J'aimerais qu'il y ait un moyen de le désactiver. Mais votre solution a fonctionné comme un rêve. Merci! – valrog