2011-09-27 11 views
93

पर sed मैं संपादित ओएस एक्स पर sed मैं निम्न आदेश का उपयोग कर रहा के साथ एक फ़ाइल चाहें संपादन:यथा-स्थान के साथ ओएस एक्स

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

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

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

हालांकि मैं एक फ़ाइल नहीं करना चाहती। मैं सिर्फ फ़ाइल 1.txt संपादित करना चाहता हूं। मैं यह कैसे कर सकता हूँ?

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

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

क्या सटीक आदेश का उपयोग कर रहे हैं जब आप '-i' ध्वज की कोशिश है? – eldarerathis

उत्तर

191

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

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 गैर-विनाशकारी रूप से उपयोग करने के लिए होगा, परीक्षण करें कि यह साफ़ रूप से बाहर निकला है, और केवल तब बाह्य फ़ाइल को हटा दें।

+0

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

+0

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

+1

मुझे हल्के खतरनाक बिट को विशेष रूप से उपयोगी पाया गया। +1 – Andre

12

मैं MacOS

के साथ इसी तरह की समस्या है
sed -i '' 's/oldword/newword/' file1.txt 

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

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

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

2

आप -i'' (--in-place) sed के लिए पहले से सुझाए गए अनुसार उपयोग कर सकते हैं। देखें: The -i in-place argument, हालांकि ध्यान दें कि -i विकल्प गैर-मानक फ्रीबीएसडी एक्सटेंशन है और अन्य ऑपरेटिंग सिस्टम पर उपलब्ध नहीं हो सकता है। दूसरा sed is a Stream EDitor, not a file editor


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

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

और के लिए बहु-फ़ाइलें:

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

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


एक और तरीका है gawk उपयोग करने के लिए है और अपनी नई "inplace" extension जैसे:

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