मैडओएस (कम से कम, ओएस 10) और यूनिक्स एक जैसे (यानी। गिल्स सीड की आवश्यकता नहीं है जैसे कि गिल्स '(वर्तमान में स्वीकृत) एक करता है)
sed -e '/CLIENTSCRIPT="foo"/a\'$'\n''CLIENTSCRIPT2="hello"' file
यह बाश में काम करता है और शायद अन्य गोले भी हैं जो $ '\ n' मूल्यांकन बोली शैली को जानते हैं। सब कुछ एक लाइन पर हो सकता है और पुराने / POSIX sed कमांड में काम कर सकता है। यदि CLIENTSCRIPT = "foo" (या आपके समतुल्य) से मेल खाते कई पंक्तियाँ हो सकती हैं और आप पहली बार केवल अतिरिक्त पंक्ति जोड़ना चाहते हैं, तो आप इसे निम्नानुसार फिर से काम कर सकते हैं:
sed -e '/^ *CLIENTSCRIPT="foo"/b ins' -e b -e ':ins' -e 'a\'$'\n''CLIENTSCRIPT2="hello"' -e ': done' -e 'n;b done' file
(यह लाइन सम्मिलन कोड के बाद एक लूप बनाता है जो बाकी फाइल के माध्यम से साइकिल करता है, फिर कभी पहले सेड कमांड पर वापस नहीं आता है)।
आप देख सकते हैं कि मैंने मैच पैटर्न में एक '^ *' जोड़ा है कि लाइन किसी टिप्पणी में दिखाई देती है, कहती है या इंडेंट की जाती है। इसकी 100% परिपूर्ण नहीं है, लेकिन कुछ अन्य स्थितियों के आम होने की संभावना है। आवश्यकतानुसार समायोजित करें ...
इन दो समाधानों को भी समस्या का दौर मिलता है (एक पंक्ति को जोड़ने के लिए जेनेरिक समाधान के लिए) कि अगर आपकी नई सम्मिलित लाइन में अनसैप्ड बैकस्लैश या एम्परसेंड्स हैं, तो उन्हें sed द्वारा समझा जाएगा और संभवत: उसी तरह बाहर नहीं आएगा, जैसे कि \n
- जैसे। \0
पहली पंक्ति का मिलान होगा। विशेष रूप से आसान है अगर आप एक ऐसी लाइन जोड़ रहे हैं जो एक वैरिएबल से आती है जहां आपको अन्यथा $ {var //} से पहले या सब सेडान आदि का उपयोग करके सब कुछ से बचना होगा।
यह समाधान लिपियों में थोड़ा कम गन्दा है (हालांकि उद्धृत करना और पढ़ना आसान नहीं है) हालांकि, जब आप कमांड के लिए रिप्लेसमेंट टेक्स्ट को एक पंक्ति के शुरू में नहीं रखना चाहते हैं, तो फ़ंक्शन में इंडेंटेड लाइनों के साथ। मैंने यह लाभ उठाया है कि शेल के द्वारा $ '\ n' का मूल्यांकन किया जाता है, इसके नियमित '\ _' एकल-उद्धरण मूल्यों में नहीं।
यह लंबे समय से पर्याप्त हो रहा है कि मुझे लगता है कि perl / यहां तक कि awk अधिक पठनीय होने के कारण जीत सकता है।