आप जो चाहते हैं, वह करना संभव नहीं है sed
। यहां तक sed
कि उस संस्करण के संस्करण भी -i
एक फ़ाइल को संपादित करने के विकल्प का समर्थन करते हैं जो आपने स्पष्ट रूप से कहा है कि आप नहीं चाहते हैं: वे एक अस्थायी फ़ाइल पर लिखते हैं और फिर फ़ाइल का नाम बदलते हैं। लेकिन शायद आप सिर्फ उपयोग कर सकते हैं ed
। उदाहरण के लिए, फ़ाइल में होने वाली सभी घटनाओं को बदलने के foo
लिए , आप यह कर सकते हैं:bar
file.txt
echo ',s/foo/bar/g; w' | tr \; '\012' | ed -s file.txt
सिंटेक्स के समान है sed
, लेकिन निश्चित रूप से बिल्कुल समान नहीं है।
लेकिन शायद आपको इस बात पर विचार करना चाहिए कि आप एक नामांकित अस्थायी फ़ाइल का उपयोग क्यों नहीं करना चाहते। यहां तक कि अगर आपके पास एक -i
सहायक नहीं है sed
, तो आप आसानी से आपके लिए काम करने के लिए एक स्क्रिप्ट लिख सकते हैं। इसके बजाय sed -i 's/foo/bar/g' file
, आप कर सकते थे inline file sed 's/foo/bar/g'
। ऐसी पटकथा लिखने के लिए तुच्छ है। उदाहरण के लिए:
#!/bin/sh -e
IN=$1
shift
trap 'rm -f $tmp' 0
tmp=$( mktemp )
<$IN "$@" >$tmp && cat $tmp > $IN # preserve hard links
अधिकांश उपयोगों के लिए पर्याप्त होना चाहिए।
-i
ग्नू सेड में एक विकल्प है, लेकिन मानक सेड में नहीं है। हालाँकि, यह सामग्री को एक नई फ़ाइल में स्ट्रीम करता है और फिर फ़ाइल का नाम बदल देता है, इसलिए यह वह नहीं है जो आप चाहते हैं।