SED no Bash Script: como substituir texto por caracteres especiais provenientes de variáveis ​​no script Bash

SED no Bash Script: como substituir texto por caracteres especiais provenientes de variáveis ​​no script Bash

primeiro, há uma variável que contém caracteres especiais no script bash. aqui está o exemplo. lista.txt:

user = root
password = 1234

Script Bash:

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

quando executei o script, o resultado é: var12342018+1234.

Atualização 1 (resposta de Oliv):

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

e o resultado ainda: senha = var12342018+1234

talvez alguém possa me ajudar. obrigado

Responder1

Primeiro você precisa citar sua var1variável.

Você pode usar bash -cem seu findcomando para fornecer a senha como uma variável:

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

Responder2

pode ajudá-lo a entender o problema que você está enfrentando, saber que &é um caractere especial que representa toda a correspondência do seu regexp.

desde que 1234foi encontrado, você está substituindo-o por var12342018+1234, os dois &estão se tornando a string correspondente.

o outro ponto que gostaria de ressaltar é realmente uma preferência pessoal, mas usando find ... -execwith {}, não gosto dessa sintaxe, geralmente termino com\;

Eu prefiro usar xargs

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

observe que o final g o substituiria quantas vezes fosse encontrado...

também isso pode ser óbvio. Não sei quantos list.txtarquivos você tem em sua subárvore, mas se você tiver apenas um, não precisa find.

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

informação relacionada