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 sed
comando, podemos recorrer la matriz para reemplazar varias cadenas. La inclusión de un comodín en el name_pattern
permitirá 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 logfile
en 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 WHAT1
se reemplazará por FOR1
y OTHER_string_to replace
se reemplazará por string replaced
en el archivo File.txt
. En el bucle se lee la matriz, el primer miembro del par se recupera como replace_what=$i
y el segundo como replace_for=$j
. El find
comando busca en el directorio el nombre del archivo (que puede contener un comodín) y el sed -i
comando reemplaza en el mismo archivo (s) lo que se definió previamente. Finalmente agregué un grep
archivo redirigido al archivo de registro para registrar los cambios realizados en los archivos.
Esto funcionó para mí GNU Bash 4.3
sed 4.2.2
y se basó en la respuesta de VasyaNovikov para Loop over tuples in bash .
sed -i 's/abc/xyz/g' xa*
?