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