यदि आप एक स्क्रिप्ट चलाने में सक्षम हैं, तो मैंने ऐसी ही स्थिति के लिए क्या किया है:
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
replace_for=$j
find
sed -i
grep
इसने मेरे लिए काम किया GNU Bash 4.3
sed 4.2.2
और बैश में ट्यूप से अधिक लूप के लिए वास्यानोविकोव के जवाब पर आधारित ।
sed -i 's/abc/xyz/g' xa*
?