Você pode usar os recursos de manipulação de strings do bash fornecidos pela expansão de parâmetros , especificamente a forma ${VARIABLE//PATTERN/REPLACEMENT}
. Tenha em mente que /
não é o único caractere que precisa ser substituído: em uma substituição s
, os caracteres \
, &
, newline e s
separator precisam ser prefixados com uma barra invertida .
replacement=$directory
replacement=${replacement//\/\\}
replacement=${replacement//\//\/}
replacement=${replacement//&/\&}
replacement=${replacement//$'\n'/\$'\n'}
sed -i "s/%DIR%/$replacement/g" -- "$config"
Como alternativa, use uma ferramenta que não requeira tais citações, como awk ou Perl.
directory=$directory awk '{gsub(/%DIR%/, ENVIRON["directory"])} 1' <"$config" >"$config.new" &&
mv -- "$config.new" "$config"
ou
directory=$directory perl -i -pe 's/%DIR%/$ENV{directory}/g' "$config"