หากคุณสามารถเรียกใช้สคริปต์ได้นี่คือสิ่งที่ฉันทำในสถานการณ์ที่คล้ายกัน:
การใช้พจนานุกรม / hashMap (อาเรย์แบบเชื่อมโยง) และตัวแปรสำหรับsed
คำสั่งนั้นเราสามารถวนลูปผ่านอาร์เรย์เพื่อแทนที่สตริงจำนวนมาก การรวมไวด์การ์ดในการname_pattern
จะอนุญาตให้แทนที่แบบแทนที่ในไฟล์ที่มีรูปแบบ (ซึ่งอาจเป็นสิ่งที่ต้องการname_pattern='File*.txt'
) ในไดเรกทอรีเฉพาะ ( source_dir
) การเปลี่ยนแปลงทั้งหมดจะถูกเขียนในlogfile
ในdestin_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
ครั้งแรกที่อาร์เรย์คู่มีการประกาศแต่ละคู่เป็นสตริงทดแทนแล้วWHAT1
จะถูกแทนที่ด้วยFOR1
และOTHER_string_to replace
จะถูกแทนที่สำหรับในแฟ้มstring replaced
File.txt
ในวงอาร์เรย์จะอ่านสมาชิกคนแรกของทั้งคู่จะถูกเรียกเป็นและครั้งที่สองเป็นreplace_what=$i
ค้นหาคำสั่งในไดเรกทอรีชื่อไฟล์ (ที่อาจมีตัวแทน) และแทนที่คำสั่งในไฟล์เดียวกัน (s) สิ่งที่ถูกกำหนดไว้ก่อนหน้า ในที่สุดฉันได้เพิ่มการเปลี่ยนเส้นทางไปยัง logfile เพื่อบันทึกการเปลี่ยนแปลงที่เกิดขึ้นในไฟล์replace_for=$j
find
sed -i
grep
นี้ทำงานสำหรับฉันในGNU Bash 4.3
sed 4.2.2
และขึ้นอยู่กับคำตอบ VasyaNovikov สำหรับ ห่วงมากกว่า tuples ในทุบตี
sed -i 's/abc/xyz/g' xa*
อะไร