कई फ़ाइलों में पाठ की एक पंक्ति जोड़ना


10

इसलिए, मेरे पास एक निर्देशिका में फ़ाइलों का एक गुच्छा है, और मुझे उनमें से प्रत्येक में पाठ की एक पंक्ति सम्मिलित करने की आवश्यकता है। उनके पास अनिवार्य रूप से निम्नलिखित प्रारूप है:


<VirtualHost *:80>
        ServerAdmin gabe@localhost
        DocumentRoot /var/www/test1
        ServerName test1.local
        ServerAlias test1
        <Directory "/var/www/test1">
                Options All
                AllowOverride All
        </Directory>
</VirtualHost>

और मैं समापन से पहले एक पंक्ति सम्मिलित करना चाहूंगा

</ VirtualHost>
टैग। मेरी पहली धारणा यह है कि मुझे ऐसा करने में सक्षम होना चाहिए, शायद उस टैग को मिलान करने और बदलने के लिए। मैं अब यह प्रयास करना शुरू करने जा रहा हूं, लेकिन अगर किसी के पास ऐसा करने का कोई मौजूदा तरीका है, तो मुझे यह सुनना अच्छा लगेगा।


जब मैं कहता हूं कि मैं ईमानदार रहूंगा, मुझे लगता है कि यह एक प्रोग्रामिंग कार्य है ... और इस तरह एसओ पर होना चाहिए। मैं यह करने के लिए पर्ल का उपयोग करूँगा, क्योंकि मैं शर्त लगाता हूं कि पर्ल के लिए डिज़ाइन किया गया एक पर्ल मॉड्यूल है, और अपाचे कॉन्फ़िगरेशन को संशोधित करना है।
xenoterracide

2
धन्यवाद, लेकिन यह एक ऐसा काम है जिसे सरल यूनिक्स उपकरणों के साथ पूरा करना आसान होना चाहिए, इसलिए यहां पूछा गया है। आपकी टिप्पणी के लिए धन्यवाद, यद्यपि।
गाबा

जवाबों:


10

कुछ इस तरह:

sed 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/'

काम करता है। यदि आप इस आदेश को बहुत सी फ़ाइल पर दोहराना चाहते हैं तो आप कुछ ऐसा कर सकते हैं:

for i in *; do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' "$i"; done

शायद बेहतर (लेकिन अप्रकाशित) @ क्रिसडाउन के लिए धन्यवाद:

find . -type f -print0 | while IFS= read -r -d '' filename;\
do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' $filename;\ 
done

भयानक ... यह वही है जो मैं देख रहा था।
गाबा

1
Ls पार्स करें । इसके बजाय एक ग्लोब का उपयोग करें। mywiki.wooledge.org/ParsingLs
क्रिस डाउन

आप @ChrisDown के लिए कठोर हैं। कृपया, मेरे उत्तर में सुधार करें।
लिप्सरी

/सेड अभिव्यक्ति के लिए एक अलग चरित्र का चयन करना क्लीनर है, क्योंकि आपको स्लैश से बचना नहीं है:'s:</VirtualHost>:yourlinehere\n</VirtualHost>:'
अलेक्जेंडर

2

अगर आपको बुरा न लगे तो पर्ल कोशिश करें:

perl -pi'*.old' -e 's(</VirtualHost>(Your stuff here\n</VirtualHost>)' myfile

-iस्विच एक साथ अपने पुराने फ़ाइल की बचत होगी .oldविस्तार और मौजूदा एक के लिए प्रिंट।


2

आप "पूर्व" (कमांड-लाइन vi) का उपयोग भी कर सकते हैं यदि आप जो संपादन करना चाहते हैं वह कुछ हद तक जटिल है। उदाहरण के लिए, आप केवल "" के एक उदाहरण के लिए इन्सर्ट करना चाहते हैं।

इस तरह एक शेल स्क्रिप्ट काम कर सकती है:

for FILENAME in *.whatever  # Need a criteria to glob, or a list of names
do
    ex -s $FILENAME << END_EDITS
/^<\/VirtualHost>/
O " capital-o, not zero
text to insert goes here
.
w!
q
END_EDITS
done

यह दृष्टिकोण आपको "पूर्व" के फायदे देता है: इलाबॉटर पैटर्न और 'कर्सर आंदोलनों' के साथ एक स्थान ढूंढना। आप पैटर्न ढूंढने जैसी चीजें कर सकते हैं, फिर अगला उदाहरण ढूंढें, यह इंसर्ट करें। या आप केवल आवेषण करने के बजाय पाठ को बदल सकते हैं। या आप श्रेणियों के बीच बदल सकते हैं। यह मत भूलो कि "पूर्व" आपको उपयोग करने देता है ""। वर्तमान लाइन के रूप में, इसलिए, / ^ somepatter / s / blah / foo / काम करेगा।


0

आप किसी फ़ाइल में दिए गए स्थान में सिंगल लाइन या मल्टीपल लाइन्स डालने के लिए निम्न लाइन लाइन कोड का उपयोग कर सकते हैं, 'वर्चुअलाइजेशन' से पहले। कोड मूल रूप से फ़ाइल नाम के लिए खोज करता है (यह * हो सकता है। *, यदि आप दिए गए निर्देशिका और उसके उप-निर्देशिकाओं के भीतर सभी फ़ाइलों में ग्रंथों को सम्मिलित करना चाहते हैं)। मिली फ़ाइलों के भीतर, यह 'VirtualHost' पैटर्न की खोज करता है। इसके पैटर्न को खोजने के बाद, यह इसे firstline \ nsecondline \ notherlines \ n \ VirtualHost से बदल देता है। ध्यान दें कि 'VirtualHost' प्रतिस्थापन के लिए पाठ का हिस्सा है, अन्यथा हम इसे नुकसान पहुंचाएंगे।

find directory/ -name filename -print | xargs sed -i 's|VirtualHost|firstline\nsecondline\notherlines\nVirtualHost|g'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.