Bir komut dosyası çalıştırabiliyorsanız, benzer bir durum için yaptığım şey:
Bir sözlük / hashMap (ilişkilendirilebilir dizi) ve sed
komut için değişkenler kullanarak, birkaç dizeyi değiştirmek için dizi arasında döngü yapabiliriz. Joker karakter name_pattern
eklenmesi name_pattern='File*.txt'
, belirli bir dizindeki ( source_dir
) bir desenle (bu gibi bir şey olabilir ) dosyalarda yerinde değiştirmeye izin verecektir . Tüm değişiklikler yazılır logfile
içindedestin_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
Birincisi, çiftleri dizisi bildirildi, her bir çift daha sonra, bir yedek dizesi WHAT1
için değiştirilecek FOR1
ve OTHER_string_to replace
için değiştirilecektir string replaced
dosyada File.txt
. Döngüde dizi okunur, çiftin ilk üyesi olarak replace_what=$i
ve ikincisi olarak alınır replace_for=$j
. find
Dizinde komut arar dosya adı (yani bir joker içerebilir) ve sed -i
daha önce tanımlanan ne aynı dosya (lar) komut cümledeki. Sonunda birgrep
, dosyalarda yapılan değişiklikleri günlüğe kaydetmek için günlük dosyasına yeniden yönlendirme .
Bu benim için çalıştı GNU Bash 4.3
sed 4.2.2
ve VasyaNovikov'un bash'daki tuples üzerine Döngü için verdiği cevaba dayanıyordu .
sed -i 's/abc/xyz/g' xa*
?