Se você é capaz de executar um script, aqui está o que eu fiz para uma situação semelhante:
Usando um dicionário / hashMap (matriz associativa) e variáveis para o sedcomando, podemos percorrer a matriz para substituir várias seqüências. A inclusão de um curinga no name_patternarquivo permitirá substituir no local os arquivos por um padrão (isso pode ser algo como name_pattern='File*.txt') em um diretório específico (source_dir ). Todas as alterações são gravadas no logfilenodestin_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
Primeiro, a matriz de pares é declarada, cada par é uma sequência de substituição e, em seguida, WHAT1será substituída por FOR1e OTHER_string_to replaceserá substituída por string replacedno arquivo File.txt. No loop, a matriz é lida, o primeiro membro do par é recuperado como replace_what=$ie o segundo comoreplace_for=$j . O findcomando pesquisa no diretório o nome do arquivo (que pode conter um curinga) e o sed -icomando substitui no (s) mesmo (s) arquivo (s) que foi definido anteriormente. Por fim, adicionei um grepredirecionado ao arquivo de log para registrar as alterações feitas nos arquivos.
Isso funcionou para mim GNU Bash 4.3 sed 4.2.2e com base na resposta de VasyaNovikov para Loop sobre tuplas no bash .
sed -i 's/abc/xyz/g' xa*?