किसी फ़ाइल में स्थायी परिवर्तन करने के लिए मैं अपनी sed कमांड कैसे प्राप्त कर सकता हूं?


32

क्या यह संभव है? मैंने कहीं पढ़ा है कि निम्नलिखित कमांड यह करेगी:

sed -e [कमांड] [फ़ाइल]

लेकिन यह सिर्फ के रूप में एक ही काम करने के लिए दिखाई दिया

sed [कमांड] [फ़ाइल]

(यह परिवर्तन नहीं बचा था)। क्या कोई ऐसा तरीका है जिससे sed का उपयोग किया जा सकता है?


2
-eझंडा अभिव्यक्ति के लिए खड़ा है। आप शायद -iझंडा चाहते हैं जिसका मतलब है in-placeऔर मैं दृढ़ता से आपको उपयोग करने की सलाह देता हूं sed -i.bak 's/../' filename
वैलेंटाइन बजरमी

जवाबों:


50

मुझे लगता है कि आप देख रहे हैं -i:

   -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if SUFFIX supplied)

उदाहरण के लिए:

$ cat foo.txt
hello world
$ sed -i 's/o/X/g' foo.txt
$ cat foo.txt
hellX wXrld

यदि आप एक प्रत्यय प्रदान करते हैं, तो यह एक बैकअप फ़ाइल बनाएगा:

$ ls
foo.txt
$ sed -i.bak 's/o/X/g' foo.txt 
$ ls
foo.txt  foo.txt.bak

इनपुट फ़ाइल को संशोधित किया जाता है और मूल फ़ाइल डेटा युक्त बैकअप बनाया जाता है।

यह भी ध्यान दें कि यह जीएनयू के लिए है sed, विभिन्न कार्यान्वयनों के बीच प्रारूप में मामूली अंतर हैं sed


4
ध्यान दें कि मैन पेज गलत है। sedइन-प्लेस संपादन नहीं करता है। यह एक नई फ़ाइल बनाता है और पुराने को अधिलेखित करता है, इनोड बदलता है।
मार्को

2
@ मर्को एक फ़ाइल को संपादित करने का सुरक्षित तरीका है। सीड डॉक्यूमेंटेशन में "फाइल को जगह में एडिट करना" का मतलब है कि ओरिजिनल फाइल (जैसा कि उसके नाम से परिभाषित है) को संशोधित किया गया है, न कि ओरिजिनल फाइल (जैसा कि उसके इनोड द्वारा परिभाषित) को संशोधित किया गया है।
गिलेस एसओ- बुराई को रोकना '

2
@ गिल्स मैं पूरी तरह से सहमत हूं कि यह एक फ़ाइल को संपादित करने का पसंदीदा तरीका है, लेकिन मैं शायद ही इसे इन-प्लेस कहूंगा । लेकिन यह इस सवाल के लिए उबाल देता है कि किसी फ़ाइल की पहचान कैसे की जाती है, इनोड या नाम से। मैं कहूंगा कि इनडायरेक्ट, अन्यथा इस तरह के विरोधाभास { rm file; cmd > file; } < fileइस निष्कर्ष की ओर ले जाएंगे कि सीएमडी उसी फ़ाइल को पढ़ता और लिखता है, जो ऐसा नहीं करता है। यह दो डिस्टेंस फाइल है जो सिर्फ एक ही नाम के होते हैं। लेकिन मैं यहां चर्चा शुरू नहीं करना चाहता।
मार्को

MacOS 10.14 पर मैं sed: 1: "foo.txt": invalid command code fदौड़ते समय मिलता हूँ sed -i 's/o/X/g' foo.txt। हालांकि, एक विस्तार प्रदान करना, sed -i .bak 's/o/X/g' foo.txtठीक काम करता है। किसी भी विचार कैसे बैकअप फ़ाइलों को बनाने के बिना इसे प्राप्त करने के लिए?
जोशुआ पिंटर

1
ठीक है, यह पता लगा। MacOS में आपको एक्सटेंशन परम विकल्प के लिए स्पष्ट रूप से एक खाली स्ट्रिंग जोड़ने की आवश्यकता है:sed -i '' 's/o/X/g' foo.txt
जोशुआ पिंटर


1

-eविकल्प कई sedकमांड निष्पादित करने के लिए है

sed -e 's/linux/unix/' -e 's/os/OS/' file.txt

पर विचार file.txtके रूप में

linux os

तब ओ / पी है

unix os

-i विकल्प स्थायी रूप से परिवर्तन सहेजता है ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.