SED en Bash Script: cómo reemplazar texto con caracteres especiales que provienen de una variable en Bash script

SED en Bash Script: cómo reemplazar texto con caracteres especiales que provienen de una variable en Bash script

Primero, hay una variable que contiene un carácter especial en el script bash. aquí está el ejemplo. lista.txt:

user = root
password = 1234

Guión de bash:

#!/bin/sh
var1 = var&2018+&
find . -name "list.txt" -exec sed -i "s/1234/"$var1"/g" {} +

cuando ejecuté el script, el resultado es: var12342018+1234.

Actualización 1 (respuesta de Oliv):

var1='var&2018+&'
find . -name "*list.txt" -exec bash -c 'sed -i "s/1234/$2/g" $1' _ {} "$var1" \;

y el resultado sigue siendo: contraseña = var12342018+1234

tal vez alguien pueda ayudarme. gracias

Respuesta1

Primero necesitas citar tu var1variable.

Puedes usar bash -cen tu findcomando para dar la contraseña como una variable:

 var1='var\&2018+\&'
 find . -name "list.txt" -exec bash -c 'sed -i "s/1234/$2/g" $1' _ {} "$var1" \;

Respuesta2

Podría ayudarle a comprender el problema que tiene al saber que &es un carácter especial que representa la coincidencia completa de su expresión regular.

Como 1234se encuentra, lo está reemplazando con var12342018+1234, los dos &se convierten en la cadena coincidente.

El otro punto que me gustaría resaltar es realmente una preferencia personal, pero al usar find ... -execwith {}no me gusta esta sintaxis, normalmente la termino con\;

prefiero usar xargs

find . -name list.txt | xargs sed -i 's/1234/var&2018+&/g'

tenga en cuenta que la terminación g la reemplazaría tantas veces como se encuentre...

Además, esto podría ser obvio. No sé cuántos list.txtarchivos tienes en tu subárbol, pero si solo tienes uno, no los necesitas find.

sed -i 's/pattern/replacement/options' filename

información relacionada