फ़ाइल के प्रारूप को बदले बिना कई पंक्तियों के साथ एक पंक्ति को जोड़ने के लिए sed कमांड [बंद]


0

मैं नीचे xml फ़ाइल है

cat example.xml
<?xml version="1.0" encoding="UTF-8"?>
<TestConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Text>
                <Checking state="BOOT" />
                <function name="configure" type="test" username="user1" num="1" Mode="NA" Type="OPEN" txt="NA-TO" TextType="guest" who="BANANNA"/>
                <function name="configure" type="test" username="user2" num="2" Mode="YA" Type="DYNAMIC-WEP" txt="NA-TO" TextType="employee" who="BANANNA" />
                <function name="configure" type="test" username="user3" num="3" Mode="YA" Type="DYNAMIC-WEP" txt="NA-TO" TextType="employee" who="BANANNA"/>
                <function name="configure" type="test" username="user4" num="4" Mode="YA" Type="WPA2-PSK" txt="CA-TO" TextType="employee" who="BANANNA">
                        <parameters name="_key" value="password" isit="true" />
                </function>
                <function name="configure" type="test" username="user5" num="5" Mode="YA" Type="WPA2-PSK" txt="CA-TO" TextType="employee" who="BANANNA">
                        <parameters name="_key" value="password" isit="true" />
                </function>
                <function name="configure" type="test" username="user6" num="7" Mode="YA" Type="WPA2-PSK" TextType="employee" who="BANANNA">
                        <parameters name="_key" value="password" isit="true" />
                </function>
        </Text>
</TestConfig>

इस फ़ाइल में, मैं 5 से पंक्ति को बदलना चाहूंगा

        <function name="configure" type="test" username="user1" num="1" Mode="NA" Type="OPEN" txt="NA-TO" TextType="guest" who="BANANNA"/>

सेवा

        <function name="configure" type="test" username="user1" num="1" Mode="YA" Type="WPA2-PSK" txt="NA-TO" TextType="guest" who="BANANNA">
                <parameters name="_key" value="password" isit="true" />
        </function>

मैंने इसे याद किया या आप फ़ाइल पेस्ट करना भूल गए? अगर मैं आपकी ज़रूरतों को समझता हूँ तो आप लाइन 5 को बदलना चाहते हैं जो इसमें शामिल है? sed -i '5s / pattern / newpattern /' file.xml तब ठीक होगा।
फ्रेंकोइस पी

आप 5 लाइन का चयन कैसे कर रहे हैं? क्या यह हमेशा 5 रेखा है? या आप लाइन 5 पर एक पैटर्न की तलाश कर रहे हैं? क्या आप सभी लाइनों को बदलना चाहते हैं <function .* />?
माइकल डफिन

भ्रम के लिए क्षमा करें, इस उदाहरण में यह पंक्ति 5 है
श्रवणकुमार दद्दोलु

2
क्या आप XML संपादक का उपयोग कर सकते हैं, जो XML को संपादित करने के लिए दर्जी से बना है, बजाय कुछ शेल पाइपलाइन के, जो XML / XHTML को पार्स करने में कुख्यात हैं ?
jayhendren

आपके प्रश्न का शीर्षक "फ़ाइल के प्रारूप को बदले बिना" का उल्लेख करता है, लेकिन आपका प्रश्न निकाय विस्तृत नहीं है। क्या आपकी चिंता यह है कि नई लाइनों को गतिशील रूप से मौजूदा लाइन (एस) के इंडेंटेशन से मेल खाना चाहिए? यदि ऐसा है, तो देखें कि मैं पाठ को इसके इंडेंटेशन के आधार पर कैसे टैग कर सकता हूं?
G-Man

जवाबों:


0

नई फ़ाइल newcontent.txt बनाएँ। वह सामग्री डालना जिसे आप बदलना चाहते हैं।


Cat new content.txt
<function name="configure" type="test" username="user1" num="1" Mode="YA" Type="WPA2-PSK" txt="NA-TO" TextType="guest" who="BANANNA">
                <parameters name="_key" value="password" isit="true" />
        </function>

अपनी आवश्यकता के अनुसार सामग्री को प्राप्त करने के लिए नीचे दिए गए आदेश का उपयोग करें


sed '5r newcontent.txt' example2.txt  | sed 5d'. 

example2.txt ==> मूल इनपुट फ़ाइल

newcontent.txt ==> सामग्री से युक्त जिसे प्रतिस्थापित करने की आवश्यकता है

उत्पादन

<?xml version="1.0" encoding="UTF-8"?>
<TestConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Text>
                <Checking state="BOOT" />
<function name="configure" type="test" username="user1" num="1" Mode="YA" Type="WPA2-PSK" txt="NA-TO" TextType="guest" who="BANANNA">
                <parameters name="_key" value="password" isit="true" />
        </function>
                <function name="configure" type="test" username="user2" num="2" Mode="YA" Type="DYNAMIC-WEP" txt="NA-TO" TextType="employee" who="BANANNA" />
                <function name="configure" type="test" username="user3" num="3" Mode="YA" Type="DYNAMIC-WEP" txt="NA-TO" TextType="employee" who="BANANNA"/>
                <function name="configure" type="test" username="user4" num="4" Mode="YA" Type="WPA2-PSK" txt="CA-TO" TextType="employee" who="BANANNA">
                        <parameters name="_key" value="password" isit="true" />
                </function>
                <function name="configure" type="test" username="user5" num="5" Mode="YA" Type="WPA2-PSK" txt="CA-TO" TextType="employee" who="BANANNA">
                        <parameters name="_key" value="password" isit="true" />
                </function>
                <function name="configure" type="test" username="user6" num="7" Mode="YA" Type="WPA2-PSK" TextType="employee" who="BANANNA">
                        <parameters name="_key" value="password" isit="true" />
                </function>
        </Text>
</TestConfig>

1
awk 'NR!=5{print} NR==5{ print "        <function name=\"configure\" type=\"test\" username=\"user1\" num=\"1\" Mode=\"YA\" Type=\"WPA2-PSK\" txt=\"NA-TO\" TextType=\"guest\" who=\"BANANNA\">"; print "                <parameters name=\"_key\" value=\"password\" isit=\"true\" />"; print ""}' /path/to/some.xml

क्या हम इस जेनेरिक को, रेखा संख्या 5 के बावजूद कर सकते हैं।
श्रवणकुमार दद्दोलू

मानदंडों के किस सेट के आधार पर?
डोपघोटी

उसी पंक्ति को लाइन 6 या 7 पर रखें विशेष रूप से पंक्ति 5 पर नहीं, बस एक यादृच्छिक रेखा संख्या, लेकिन सामग्री समान होगी और प्रति फ़ाइल केवल एक प्रविष्टि होगी
श्रवणकुमार दद्दोलू

ओपी में, आप विशेष रूप से अपनी सामग्री या अपनी उदाहरण इनपुट फ़ाइल में अन्य समान लाइनों के संदर्भ के बिना पांचवीं पंक्ति को बदलने के लिए पूछते हैं। जो आप चाहते हैं उसे बताने के बजाय जो आप चाहते हैं उसे देने के लिए कहें, जो आप चाहते हैं, उन्होंने आपको वह नहीं दिया जो आप चाहते थे।
डोपघोटी

1

XML को पार्स या संपादित करने के लिए नियमित अभिव्यक्तियों का उपयोग न करें। यह मज़बूती से काम नहीं करता है, और मज़बूती से काम करने के लिए नहीं बनाया जा सकता है - भले ही आप कुछ ऐसा हैक करें जो "काम" करता है, इनपुट एक्सएमएल फ़ाइल में छोटे बदलाव या अप्रत्याशित बदलाव किसी भी regex-only स्क्रिप्ट को तोड़ सकते हैं।

इसके बजाय, या तो उपयोग करें:

  • प्रोग्रामिंग भाषा जैसे कि perlया python(या कई अन्य) जिसमें XML पार्सिंग लाइब्रेरी हैं।
  • xmlstarlet जैसा एक कमांड-लाइन टूल , जो अधिकांश लिनक्स वितरण और अन्य यूनिक्स-जैसे सिस्टम के लिए पूर्व-पैक उपलब्ध है।

यदि आपको वास्तव में उपयोग करना चाहिए sedया awk, तो ऐसे उपकरणों के साथ प्रसंस्करण के लिए उपयुक्त XML डेटा को लाइन-ओरिएंटेड फॉर्मेट में परिवर्तित करने के लिए xml2 का उपयोग करें , और फिर 2xmlबाद में XML को ठीक से स्वरूपित करने के लिए इसे वापस कनवर्ट करें। जैसे

xml2 < yourxmlfile | your sed/awk script here | 2xml > newxmlfile
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.