ओएस एक्स पर sed के साथ जगह में संपादन


142

मैं ओएस एक्स पर सीड के साथ एक फाइल को संपादित करना चाहता हूं। मैं निम्नलिखित कमांड का उपयोग कर रहा हूं:

sed 's/oldword/newword/' file.txt

आउटपुट टर्मिनल पर भेजा जाता है। file.txt को संशोधित नहीं किया गया है। परिवर्तन इस आदेश के साथ file2.txt में सहेजे गए हैं :

sed 's/oldword/newword/' file1.txt > file2.txt

हालाँकि मुझे दूसरी फाइल नहीं चाहिए। मैं सिर्फ file1.txt को एडिट करना चाहता हूं । मैं यह कैसे कर सकता हूँ?

मैंने -i ध्वज की कोशिश की है। इसका परिणाम निम्न त्रुटि है:

sed: 1: "file1.txt": invalid command code f

2
जब आप -iध्वज को आज़माते हैं, तो आपके द्वारा उपयोग की जा रही सटीक कमांड क्या है ?
एल्डररैथिस

जवाबों:


282

आप -iबैकअप-अप फ़ाइल में जोड़ने के लिए प्रत्यय प्रदान करके झंडे का सही उपयोग कर सकते हैं । अपने उदाहरण का विस्तार:

sed -i.bu 's/oldword/newword/' file1.txt

आपको दो फाइलें देगा: एक उस नाम के साथ file1.txtजिसमें प्रतिस्थापन है, और एक उस नाम के साथ file1.txt.buजिसमें मूल सामग्री है।

हल्के से खतरनाक

यदि आप मूल फ़ाइल को विधिपूर्वक अधिलेखित करना चाहते हैं, तो कुछ का उपयोग करें:

sed -i '' 's/oldword/newword/' file1.txt
      ^ note the space

जिस तरह से रेखा को पार्स किया जाता है, उसके कारण विकल्प ध्वज और उसके तर्क के बीच एक स्थान की आवश्यकता होती है क्योंकि तर्क शून्य-लंबाई है।

संभवतः आपके मूल को रौंदने के अलावा, मुझे इस तरह से छल करने के किसी भी आगे के खतरों के बारे में पता नहीं है। हालांकि, यह ध्यान दिया जाना चाहिए कि यदि यह आह्वान sedकिसी स्क्रिप्ट का हिस्सा है, तो यूनिक्स वे ™ (IMHO) sedगैर-विनाशकारी रूप से उपयोग किया जाएगा , यह परीक्षण करें कि यह सफाई से बाहर निकल गया है, और केवल तब बाहरी फ़ाइल को हटा दें।


आप सही हैं मैं -i ध्वज के बाद एक्सटेंशन को छोड़ रहा था। है -i''किसी भी अन्य कारण से संभावित रूप से मूल फ़ाइल अप खिलवाड़ (और कोई बैक-अप होने) के लिए खतरनाक?
संडेमोंडे

sedमैन पेज के अनुसार यदि आप डिवाइस पर डिस्क स्पेस से बाहर निकलते हैं तो आप एक फाइल को मिड-स्ट्राइड कर सकते हैं और इसका आउटपुट खराब हो सकता है। यदि आप sed -i ""बैकअप के बिना स्थानीय स्रोत नियंत्रण में काम कर रहे हैं, तो अधिकांश समय ठीक होना चाहिए (या बस मोड git init && git add -A . && git commit -m 'backup'में चलने से पहले -i)।
cfeduke

2
मुझे विशेष रूप से उपयोगी मामूली खतरनाक सा मिला। +1
आंद्रे

5
BSD sed की आवश्यकता है कि -i ध्वज के बाद कोई स्थान न हो। तो, -i''मान्य है, लेकिन -i ''नहीं है।
टॉड ए। जैकब्स

3
अरे! इसके बजाय BSD sed '\ n' वर्ण और मुद्रण 'n' को अनदेखा कर रहा है! Im बस मेरे मैक पर GNU sed के साथ BSD sed को बदलने जा रहा हूँ!
रात

20

मुझे मैकओएस के साथ भी ऐसी ही समस्या है

sed -i '' 's/oldword/newword/' file1.txt

काम नहीं करता है, लेकिन

sed -i"any_symbol" 's/oldword/newword/' file1.txt

अच्छा काम करता है।


अब यह दूसरा रास्ता है। sed -i '' <file>काम करता है, लेकिन sed -i'' <file>अब काम नहीं करता
ज़ोहैब अमनज़ई


4

आप पहले से सुझाए गए अनुसार उपयोग कर सकते हैं -i''( --in-place) sed। देखें: यथा-स्थान तर्क , हालांकि ध्यान दें कि विकल्प अमानक FreeBSD एक्सटेंशन और अन्य ऑपरेटिंग सिस्टम पर उपलब्ध नहीं हो सकता। दूसरी बात यह है कि S tream ED itor है, फाइल एडिटर नहीं-i-ised


वैकल्पिक तरीका विम एक्स मोड में अंतर्निहित प्रतिस्थापन का उपयोग करना है, जैसे:

$ ex +%s/foo/bar/g -scwq file.txt

और कई-फाइलों के लिए:

$ ex +'bufdo!%s/foo/bar/g' -scxa *.*

सभी फ़ाइलों को पुनरावर्ती रूप से संपादित करने के लिए **/*.*यदि शेल समर्थन करता है तो आप इसका उपयोग कर सकते हैं (सक्षम करके shopt -s globstar)।


एक और तरीका उपयोग करना है gawkऔर इसका नया "इनहेल" एक्सटेंशन जैसे:

$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1

4

यह बैकअप फाइल बनाता है। sed -i -e 's/hello/hello world/' testfileमेरे लिए जैसे , एक ही dir में एक बैकअप फ़ाइल, testfile-e बनाता है।


मैक ओएस कैटालिना के साथ यहां भी। दोनों -i और -e को अलग-अलग पास करना (NOT -ie एक साथ!) '-E' के साथ एक बैकअप फाइल बनाता है।
डैनियल केसनर

1

आप उपयोग कर सकते हैं:

sed -i -e 's/<string-to-find>/<string-to-replace>/' <your-file-path>

उदाहरण:

sed -i -e 's/Hello/Bye/' file.txt

यह मैक में निर्दोष काम करता है ।


2
यह मैक ओएस कैटालिना में मेरे लिए '-ई' के साथ एक बैकअप फ़ाइल बनाता है।
डेनियल केसर

यह macOS के लिए गलत है। कृपया "मैन सेड" पृष्ठ पर एक नज़र डालें। -imacOS के लिए एक तर्क की आवश्यकता है। चूँकि आप किसी को निर्दिष्ट नहीं करते हैं, यह उपयोग करता है -e, जिसके परिणामस्वरूप एक दूसरी फ़ाइल -eसंलग्न है। -emacOS में मौजूद नहीं है, यह है -E। तो macOS के लिए सही कमांड हैsed -i '' -E 's/Hello/Bye/' file.txt
मार्क जे। श्मिट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.