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 sed
comando, podemos percorrer a matriz para substituir várias seqüências. A inclusão de um curinga no name_pattern
arquivo 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 logfile
nodestin_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, WHAT1
será substituída por FOR1
e OTHER_string_to replace
será substituída por string replaced
no arquivo File.txt
. No loop, a matriz é lida, o primeiro membro do par é recuperado como replace_what=$i
e o segundo comoreplace_for=$j
. O find
comando pesquisa no diretório o nome do arquivo (que pode conter um curinga) e o sed -i
comando substitui no (s) mesmo (s) arquivo (s) que foi definido anteriormente. Por fim, adicionei um grep
redirecionado ao arquivo de log para registrar as alterações feitas nos arquivos.
Isso funcionou para mim GNU Bash 4.3
sed 4.2.2
e com base na resposta de VasyaNovikov para Loop sobre tuplas no bash .
sed -i 's/abc/xyz/g' xa*
?