एक पंक्ति में एक पैटर्न की पहली घटना को प्रतिस्थापित करते हुए, फाइल के साथ सभी लाइनों के लिए सीड के साथ


16

क्या एक लाइनर में ऐसा करना संभव है?

मेरा आउटपुट इस तरह है:

"First line" - Description  
" Second line" - Description  
"Third line" - Description  
" Fourth line" - Description  

यह इनपुट अपने आप जेनरेट होता है।

मैं प्रत्येक पंक्ति के लिए "(उद्धरण चिह्न + स्थान) की पहली घटना को प्रतिस्थापित करना चाहता हूं "। अगर मैं प्रतिस्थापन विश्व स्तर पर लागू होते हैं, यह भी की प्रत्येक पुनरावृत्ति बदल जाएगा line" -करने के लिए line"-, अगर यह यह पूरा करने के लिए एक sed एक लाइनर उपयोग करना संभव है तो मैं सोच रहा था।

मैंने ^इस तरह का उपयोग करने की कोशिश की है

sed -r ':a;N;$!ba;s/(\^\" )/\"/g'

लेकिन यह काम नहीं कर रहा है, यह कुछ भी प्रतिस्थापित नहीं करता है। मैंने कोशिश की

sed -r ':a;N;$!ba;s/(^|\" )/\"/g'

और यह सभी घटनाओं को बदल देता है। मैंने अभी सेड का उपयोग करना शुरू किया है, इसलिए मुझे नहीं पता कि मैं कुछ गलत कर रहा हूं।

मुझे यहां क्या समझ नहीं आ रहा है?


लेबल के बारे में एक नोट: आपके द्वारा ऊपर लिखी गई कमांड कुछ कार्यान्वयन में काम कर सकती है sed, लेकिन पोर्टेबिलिटी के लिए और वास्तव में अजीब त्रुटियों से बचने के लिए, आपको एक लेबल के बाद दिए गए कमांड तर्क को समाप्त करना चाहिए (यदि आपको उनकी आवश्यकता है)। जैसे,sed -e ':a' -e 'N;$!ba' -e 'whatever'
वाइल्डकार्ड

जवाबों:


34

आप इसे खत्म कर रहे हैं। sedडिफ़ॉल्ट रूप से ( /gसंशोधक के बिना ) एक पंक्ति पर केवल पहला उदाहरण बदलता है , हालांकि आप अभी भी लंगर डालना चाहते हैं क्योंकि आप नहीं चाहते हैं; लाइन में पहला उदाहरण लाइन के शुरू में एक के रूप में चाहते हैं; और आपको आमतौर पर उन स्पष्ट रेखा क्रियाओं की आवश्यकता नहीं है जिन्हें आप उपयोग करने का प्रयास कर रहे हैं (क्यों?)।

sed 's/^" /"/'

धन्यवाद! मैंने सोचा था कि किसी फ़ाइल पर काम करते समय लाइन एक्शन को स्पष्ट रूप से घोषित करना आवश्यक था, इसके बारे में पढ़ें और बस उनका उपयोग करते रहें। मैं वास्तव में यह सोच रहा था, कि यह आसान नहीं हो सकता है और यह चाल :)
स्टीव बी।

मुझे यह कहने के लिए लुभाया जाता है कि वे आदेश बहुत अप्रचलित हैं; उनके साथ काफी जटिल मल्टीलाइन चीजें करना संभव है, लेकिन ऐसा करना आसान नहीं है और इन दिनों आप पर्ल / पायथन / रूबी / जो कुछ भी हो का उपयोग करके वास्तव में बेहतर हैं।
geekosaur

उपरोक्त टिप्पणी से पूरी तरह असहमत; बहु लाइन sedके रूप में इस तरह के आदेशों Nऔर इस तरह के लेबल के रूप में :aबिल्कुल भी अप्रचलित नहीं हैं और वे कर रहे हैं पोर्टेबल और POSIX निर्दिष्ट , पर्ल / पायथन / रूबी के विपरीत / जो कुछ भी। हालाँकि यह सच है कि अगर आप खुद को अक्सर उनकी ज़रूरत महसूस करते हैं, तो आपको सीखनाawk चाहिए ।
वाइल्डकार्ड

2

एक और सामान्य उत्तर, क्योंकि मैं geekosaur के जवाब पर टिप्पणी नहीं कर सकता - आप ^ (लाइन एंकर की शुरुआत) नहीं डालेंगे। उदाहरण के लिए, यदि आप A की पहली घटना को B से बदलना चाहते हैं, तो आपके पास होगा

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