Nếu bạn có thể chạy một kịch bản, đây là những gì tôi đã làm cho một tình huống tương tự:
Sử dụng một từ điển / hashMap (mảng kết hợp) và các biến cho sedlệnh, chúng ta có thể lặp qua mảng để thay thế một số chuỗi. Bao gồm một ký tự đại diện trong name_patternsẽ cho phép thay thế tại chỗ trong các tệp bằng một mẫu (đây có thể là một cái gì đó giống như name_pattern='File*.txt') trong một thư mục cụ thể ( source_dir). Tất cả các thay đổi được ghi trong logfiletrongdestin_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
Đầu tiên, mảng cặp được khai báo, mỗi cặp là một chuỗi thay thế, sau đó WHAT1sẽ được thay thế FOR1và OTHER_string_to replacesẽ được thay thế string replacedtrong tệp File.txt. Trong vòng lặp, mảng được đọc, thành viên đầu tiên của cặp được lấy ra replace_what=$ivà thứ hai là replace_for=$j. Các findtìm kiếm lệnh trong thư mục tên tập tin (có thể chứa một ký tự đại diện) và sed -iThay thế lệnh trong cùng một file (s) những gì đã được định nghĩa trước. Cuối cùng tôi đã thêm một grepchuyển hướng vào logfile để ghi lại những thay đổi được thực hiện trong (các) tệp.
Điều này làm việc cho tôi GNU Bash 4.3 sed 4.2.2và dựa trên câu trả lời của VasyaNovikov cho Loop over tuples in bash .
sed -i 's/abc/xyz/g' xa*sao?