Jika Anda dapat menjalankan skrip, inilah yang saya lakukan untuk situasi serupa:
Menggunakan kamus / hashMap (array asosiatif) dan variabel untuk sed
perintah, kita bisa mengulang array untuk mengganti beberapa string. Termasuk wildcard di name_pattern
akan memungkinkan untuk mengganti di tempat dalam file dengan pola (ini bisa menjadi sesuatu seperti name_pattern='File*.txt'
) di direktori tertentu ( source_dir
). Semua perubahan ditulis di logfile
dalamdestin_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
Pertama, array pasangan dideklarasikan, masing-masing pasangan adalah string pengganti, kemudian WHAT1
akan diganti untuk FOR1
dan OTHER_string_to replace
akan diganti untuk string replaced
dalam file File.txt
. Dalam loop array dibaca, anggota pertama dari pasangan tersebut diambil sebagai replace_what=$i
dan yang kedua sebagai replace_for=$j
. The find
pencarian perintah dalam direktori nama file (yang mungkin berisi wildcard) dan sed -i
Menggantikan perintah dalam file yang sama (s) apa yang didefinisikan sebelumnya. Akhirnya saya menambahkangrep
arahan ulang ke logfile untuk mencatat perubahan yang dibuat dalam file.
Ini bekerja untuk saya GNU Bash 4.3
sed 4.2.2
dan berdasarkan jawaban VasyaNovikov untuk Loop over tuple di bash .
sed -i 's/abc/xyz/g' xa*
?