यदि आप के बराबर चाहते हैं sed -i.bak
, यह बहुत आसान है।
GNU sed के लिए इस लिपि पर विचार करें:
#!/bin/sh
# Create an input file to demonstrate
trap 'rm -r "$dir"' EXIT
dir=$(mktemp -d)
grep -v '[[:upper:][:punct:]]' /usr/share/dict/words | head >"$dir/foo"
# sed program - removes 'aardvark' and 'aardvarks'
script='/aard/d'
##########
# What we want to do
sed -i.bak -e "$script" "$dir"
##########
# Prove that it worked
ls "$dir"
cat "$dir/foo"
हम बस चिह्नित लाइन को बदल सकते हैं
cp "$dir/foo" "$dir/foo.bak" && sed -e "$script" "$dir/foo.bak" >"$dir/foo"
यह मौजूदा फ़ाइल को एक बैकअप बनाता है, और एक नई फ़ाइल लिखता है।
अगर हम इसके बराबर चाहते हैं
sed -i -e "$script" "$dir" # no backup
तो यह थोड़ा और अधिक जटिल है। हम मानक इनपुट के रूप में पढ़ने के लिए फ़ाइल खोल सकते हैं, फिर इसे बदलने के लिए sed के आउटपुट को निर्देशित करने से पहले इसे अनलिंक करें:
( cp "$dir/foo" "$dir/foo.bak"; exec <"$dir/foo.bak"; rm "$dir/foo.bak"; exec sed -e "$script" >"$dir/foo" )
हम इसे एक उप-शेल में करते हैं, ताकि इसके बाद भी हमारी मूल गति उपलब्ध हो। इनपुट को स्विच करना और बिना सबस्क्रिप्शन के वापस स्विच करना संभव है, लेकिन यह तरीका मुझे स्पष्ट लगता है।
ध्यान दें कि हम एक नई foo
फ़ाइल बनाने के बजाय पहले कॉपी करने के लिए सावधान हैं - यह महत्वपूर्ण है अगर फ़ाइल एक से अधिक नामों से जानी जाती है (यानी इसमें हार्ड लिंक हैं) और आप सुनिश्चित करना चाहते हैं कि आप लिंक को न तोड़ें ।
/usr/gnu/bin/sed
-आई समर्थन प्राप्त करने के लिए उपयोग करें।