Sed – remplacer une chaîne par une variable pleine de caractères étranges

J’utilise sed pour remplacer un caractère dans un fichier par une variable. Cette variable lit essentiellement le contenu d’un fichier ou d’une page Web contenant plusieurs chaînes de type hachage, comme ci-dessous, générées de manière aléatoire:

define('AUTH_KEY', 'CVo|BO;Qt1B|+GE}+h2/yU7h=5`/wRV{>%h.b_;s%S8-p|>qpf]|/Vf@`&[g~*:&'); define('SECURE_AUTH_KEY', '{G2-<^jWRd7]2,?]6hhM^*asg.2C.+k=gf33-m+ZK_{Mt|q*<ELF4|gPjyxtTh!)'); define('LOGGED_IN_KEY', 'jSNo9Z;5d]tzZoh-QQ`{M-&~y??$R({:*m`0={67=+mF?L.e+R{;)+4}qCAAHz=C'); define('NONCE_KEY', '19Vt4=%8j/Z-&~ni0SdC-rr]5{al64|?_Hz }JG$yEi:_aU )Olp YAD+'); define('SECURE_AUTH_SALT', 'hm#Z%O!X_mr?lM|>>~r-?F%wi R($}|9R[):4^NTsj+gS[qnv}7|+0<9e-$DJjju'); define('LOGGED_IN_SALT', 'tyPHBOCkXZh_4H;G|^.&|^#JPB/f;{}y_Orj!6AH?@wovx+KKtTZ A[HMS9SZJ|N'); define('NONCE_SALT', 'Eb-/t 5D-vPV9I--8F<[^lcherGv.g+|7p6;+xP|5g6P}tup1K.vuHAQ=uWZ#}H^'); 

La variable est définie comme suit:

 KEY=$(cat keyfile) 

J’ai utilisé la syntaxe sed suivante:

 sed -i "s/ssortingngtoreplace/$KEY/" /path/to/file 

J’ai également essayé différentes variantes, en utilisant des guillemets simples, des guillemets autour des variables

 sed -i "s/ssortingngtoreplace/"$KEY"/" /path/to/file sed -i "s/ssortingngtoreplace/"${KEY}"/" /path/to/file sed -i "s/ssortingngtoreplace/'$KEY'/" /path/to/file 

Je pense que je suis “forcé” de toutes les manières possibles pour mettre des citations et je ne sais pas comment échapper à des caractères générés aléatoirement comme ceux-là. Je continue à recevoir l’erreur suivante:

commande non terminée

Des suggestions sur la façon de remplacer la chaîne par la variable de type hash-hash?

sed est un excellent outil pour des substitutions simples sur une seule ligne mais pour tout ce que vous devez utiliser awk:

 awk -v key="$KEY" '{sub(/ssortingngtoreplace/,key)}1' file 

Cela fonctionnera quels que soient les caractères “$ KEY”, sauf pour “&”.

Une possibilité est d’utiliser bash au lieu de sed . Cela facilite la substitution, mais vous devrez émuler l’option -i .

Quelque chose comme ça:

 TMPFILE=$(mktemp) KEY=$(cat keyfile) while IFS= read -r LINE; do echo "${LINE//ssortingngtoreplace/$KEY}" done $TMPFILE mv $TMPFILE /path/to/file 

Essaye ça:

 KEY=$(cat keyfile | sed -e 's/[]\/()$*.^|[]/\\&/g') sed -i "s/ssortingngtoreplace/$KEY/" /path/to/file 

Le problème est que la variable $ KEY contient des barres obliques, qui sont les délimiteurs de votre commande.

sed peut faire plus que chercher et remplacer:

 sed '/ssortingngtoreplace/{ d r keyfile }' /path/to/file 

Je suppose que “ssortingngtoreplace” se produit par lui-même sur une ligne.