Bir komut dosyası çalıştırabiliyorsanız, benzer bir durum için yaptığım şey:
Bir sözlük / hashMap (ilişkilendirilebilir dizi) ve sedkomut için değişkenler kullanarak, birkaç dizeyi değiştirmek için dizi arasında döngü yapabiliriz. Joker karakter name_patterneklenmesi 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 logfileiç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 WHAT1için değiştirilecek FOR1ve OTHER_string_to replaceiçin değiştirilecektir string replaceddosyada File.txt. Döngüde dizi okunur, çiftin ilk üyesi olarak replace_what=$ive ikincisi olarak alınır replace_for=$j. findDizinde komut arar dosya adı (yani bir joker içerebilir) ve sed -idaha ö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.2ve VasyaNovikov'un bash'daki tuples üzerine Döngü için verdiği cevaba dayanıyordu .
sed -i 's/abc/xyz/g' xa*?