इन-प्लेस तर्क के लिए कई अभिव्यक्ति के साथ sed


24

मैं फ़ाइल का उपयोग करके कई शब्दों को बदलने का प्रयास कर रहा हूं sed -i #expression1 #expression2

फ़ाइल

Something  123 item1
Something  456 item2
Something  768 item3
Something  353 item4

आउटपुट (वांछित)

anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

प्रयास करें बहिष्कार

मैं sed -i2 बार उपयोग करके निम्नलिखित आउटपुट प्राप्त कर सकता हूं ।

 sed -i 's/Some/any/g' file
 sed -i 's/item/stuff/g' file

क्या मेरे पास इसे सिंगल-इन-कमांड की तरह बनाने का कोई संभावित तरीका हो सकता है

sed -i 's/Some/any/g' -i 's/item/stuff/g' file

जब मैंने उपरोक्त कोड की कोशिश की तो यह s/item/stuff/gएक फ़ाइल के रूप में लेता है और इस पर काम करने की कोशिश करता है ।।


यदि आपकी फ़ाइलें ऊपर दिए गए उदाहरण के समान हैं (यानी वे उसी पैटर्न का अनुसरण करते हैं) तो आप इसे एक ही प्रतिस्थापन के साथ कर सकते हैं:sed - i 's/Some\(.*\)item/any\1stuff/' file
don_crissti

जवाबों:


26

sedआपके सिस्टम के संस्करण के आधार पर आप ऐसा करने में सक्षम हो सकते हैं

sed -i 's/Some/any/; s/item/stuff/' file

आपको यहां कमांड gमें अंतिम स्लैश के बाद की आवश्यकता नहीं sहै, क्योंकि आप प्रति पंक्ति केवल एक प्रतिस्थापन कर रहे हैं।

वैकल्पिक रूप से:

sed -i -e 's/Some/any/' -e 's/item/stuff/' file

-iविकल्प बताता है sedजगह में फ़ाइलों को संपादित करने के लिए; यदि -iउसके बाद वर्ण हैं तो sedमूल फ़ाइल का बैकअप बनाता है और उन वर्णों का बैकअप फ़ाइल के एक्सटेंशन के रूप में उपयोग करता है। उदाहरण के लिए,

sed -i.bak 's/Some/any/; s/item/stuff/' file

या

sed -i'.bak' 's/Some/any/; s/item/stuff/' file

fileमूल को सहेजते हुए संशोधित करेगा file.bak

बेशक, एक यूनिक्स (या यूनिक्स जैसी) प्रणाली पर, हम आम तौर पर '.bak' के बजाय '~' का उपयोग करते हैं, इसलिए

sed -i~ 's/Some/any/;s/item/stuff/' file

2
ध्यान दें कि आप GNU संस्करण का वर्णन कर रहे हैं। बीएसडी संस्करण (फ्रीबीएसडी या ओएस / एक्स में) के लिए एक तर्क की आवश्यकता है-i । तो sed -i '' 's/a/b/;s/c/d/' fileया sed -i .back 's/a/b/;s/c/d/'या sed -i.back 's/a/b/;s/c/d/'वहाँ। अन्य sedकार्यान्वयन आम तौर पर समर्थन नहीं करते हैं -i
स्टीफन चेजालस

यह स्पष्ट करने के लिए @ StéphaneChazelas धन्यवाद। और मुझे लगता है कि मुझे यह कहने में अधिक स्पष्ट होना चाहिए कि GNU sed में और विस्तार के बीच कोई स्थान नहीं हो सकता है -i
PM 2Ring

sed -i 's/$username = "root"/$username = "newuser"/; s/$password = "password"/$password = "passwd"/; s/$dbname="handicraftstore"/$dbname="handicraft"' Web/database.phpपरिणाम sed: -e expression #1, char 141: unterminated 'कमांड'
एलील

@alhelal क्षमा करें, टिप्पणियां सवाल पूछने के लिए उचित जगह नहीं हैं। लेकिन वैसे भी, आपकी अंतिम sकमान अपने अंतिम को याद कर रही है /
PM 2Ring

@ PM2Ring जैसा कि मैंने नोटिस नहीं किया कि मुझे लगता है कि यह आपके समाधान से संबंधित है। हालाँकि, धन्यवाद।
अल्हलाल

10

आप सीड एक्सप्रेशन को एक साथ जोड़ सकते हैं ";"

%sed -i 's/Some/any/g;s/item/stuff/g' file1
%cat file1
anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

5

कई -eविकल्पों का उपयोग करके कई अभिव्यक्ति :

sed -i.bk -e 's/Some/any/g' -e 's/item/stuff/g' file

या आप सिर्फ एक का उपयोग कर सकते हैं:

sed -i.bk -e 's/Some/any/g;s/item/stuff/g' file

आपको बैकअप फ़ाइल के लिए एक एक्सटेंशन देना चाहिए, जब से कुछ कार्यान्वयन sed, जैसे कि OSX sed खाली एक्सटेंशन के साथ काम नहीं करता है (आपको sed -i ''मूल फ़ाइलों को ओवरराइड करने के लिए उपयोग करना चाहिए )।


1

आप पूर्व मोड में विम का उपयोग कर सकते हैं:

ex -sc '%s/Some/any/|%s/item/stuff/|x' file
  1. % सभी लाइनों का चयन करें

  2. s विकल्प

  3. x सहेजें और बंद करें

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