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 sed
lệ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_pattern
sẽ 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 logfile
trongdestin_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 đó WHAT1
sẽ được thay thế FOR1
và OTHER_string_to replace
sẽ được thay thế string replaced
trong 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=$i
và thứ hai là replace_for=$j
. Các find
tì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 -i
Thay 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 grep
chuyể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.2
và 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?