Si puede ejecutar un script, esto es lo que hice para una situación similar:
Usando un diccionario / hashMap (matriz asociativa) y variables para el sedcomando, podemos recorrer la matriz para reemplazar varias cadenas. La inclusión de un comodín en el name_patternpermitirá reemplazar en el lugar en los archivos con un patrón (esto podría ser algo así name_pattern='File*.txt') en un directorio específico ( source_dir). Todos los cambios están escritos logfileen eldestin_dir
#!/bin/bash
source_dir=source_path
destin_dir=destin_path
logfile='sedOutput.txt'
name_pattern='File.txt'
echo "--Begin $(date)--" | tee -a $destin_dir/$logfile
echo "Source_DIR=$source_dir destin_DIR=$destin_dir "
declare -A pairs=(
['WHAT1']='FOR1'
['OTHER_string_to replace']='string replaced'
)
for i in "${!pairs[@]}"; do
j=${pairs[$i]}
echo "[$i]=$j"
replace_what=$i
replace_for=$j
echo " "
echo "Replace: $replace_what for: $replace_for"
find $source_dir -name $name_pattern | xargs sed -i "s/$replace_what/$replace_for/g"
find $source_dir -name $name_pattern | xargs -I{} grep -n "$replace_for" {} /dev/null | tee -a $destin_dir/$logfile
done
echo " "
echo "----End $(date)---" | tee -a $destin_dir/$logfile
Primero, se declara la matriz de pares, cada par es una cadena de reemplazo, luego WHAT1se reemplazará por FOR1y OTHER_string_to replacese reemplazará por string replaceden el archivo File.txt. En el bucle se lee la matriz, el primer miembro del par se recupera como replace_what=$iy el segundo como replace_for=$j. El findcomando busca en el directorio el nombre del archivo (que puede contener un comodín) y el sed -icomando reemplaza en el mismo archivo (s) lo que se definió previamente. Finalmente agregué un greparchivo redirigido al archivo de registro para registrar los cambios realizados en los archivos.
Esto funcionó para mí GNU Bash 4.3 sed 4.2.2y se basó en la respuesta de VasyaNovikov para Loop over tuples in bash .
sed -i 's/abc/xyz/g' xa*?