2009-03-31 12 views
5

मुझे लगता है कि मैं अपने डेटाबेस में आयात करने की कोशिश कर रहा हूँ मेरी linux बॉक्स पर एक 2GB पाठ फ़ाइल है।मैं टेक्स्ट फ़ाइल में लाइन नंबर से किसी विशिष्ट पंक्ति को कैसे प्रतिस्थापित कर सकता हूं?

mismatched tag at line 25462599, column 2, byte 1455502679: 
<link r:resource="http://www.epuron.de/"/> 
<link r:resource="http://www.oekoworld.com/"/> 
</Topic> 
=^ 

मैं </Line> साथ </Topic> बदलना चाहते हैं:

समस्या मैं आ रही

कि स्क्रिप्ट है कि इस rdf फ़ाइल संसाधित कर रहा है एक लाइन पर घुट रहा है। मैं सभी लाइनों पर एक खोज/प्रतिस्थापन नहीं कर सकता लेकिन मेरे पास लाइन नंबर है इसलिए मुझे आशा है कि नए टेक्स्ट के साथ उस पंक्ति को प्रतिस्थापित करने के लिए कुछ आसान तरीका है।

कोई भी विचार/सुझाव?

उत्तर

11
sed -i yourfile.xml -e '25462599s!</Topic>!</Line>!' 
+0

यह तब काम नहीं करता है जब उद्घाटन टैग एक ही पंक्ति पर है ... –

+0

अच्छी पकड़। फिक्स्ड। – chaos

+0

अब इसे चल रहा है। धन्यवाद! – GeoffreyF67

7
sed -i '25462599 s|</Topic>|</Line>|' nameoffile.txt 
2

"सिर" का प्रयोग करें पहले 25,462,598 लाइनों हो और "पूंछ" का उपयोग शेष लाइनों (25,462,601 से शुरु करके) प्राप्त करने के लिए करने के लिए। हालांकि ... 2 जीबी फ़ाइल के लिए इसमें कुछ समय लगेगा।

भी कर रहे हैं क्या आप वाकई समस्या सिर्फ इतना है कि लाइन के साथ है और कहीं न कहीं पिछले नहीं (यानी। त्रुटि एक XML पार्स त्रुटि जो वास्तविक समस्या मतलब हो सकता है की तरह लग रहा वरना किसी ऐसे स्थान पर है)।

+0

लाइन टैग स्वयं बंद कर रहे हैं, तो अतिरिक्त कहीं और आरंभ किया जाना चाहिए ... –

+0

जो मुझे देखने के लिए बनाया गया है और यह वास्तव में ExternalPage था मैं बदलने के लिए की जरूरत है। धन्यवाद! – GeoffreyF67

5

लेख को संपादित करने फ़ाइलें यूनिक्स में के लिए उपकरण, ed कहा जाता है (जैसा कि sed है, जो के रूप में नाम का तात्पर्य एक धारा संपादक है के खिलाफ)।

ed एक बार एक इंटरैक्टिव संपादक के रूप में इरादा था, लेकिन यह भी आसानी से पटकथा कर सकते हैं। जिस तरह से ed काम करता है, यह है कि सभी आदेश एक पता पैरामीटर लेते हैं। जिस तरह से एक विशिष्ट लाइन को संबोधित करने के बस लाइन संख्या, और जिस तरह से संबोधित लाइन (रों) बदलने के लिए s आदेश है, जो कि sed उसी regexp लेता है। तो, 42 वें लाइन को बदलने के लिए, आप 42s/old/new/ जैसे कुछ लिखेंगे।

यहाँ पूरे आदेश दिया गया है:

FILENAME=/path/to/whereever 
LINENUMBER=25462599 

ed -- "${FILENAME}" <<-HERE 
    ${LINENUMBER}s!</Topic>!</Line>! 
    w 
    q 
HERE 

इस का लाभ यह है कि ed, मानकीकृत है, जबकि sed को -i झंडा एक मालिकाना जीएनयू विस्तार है जो सिस्टम का एक बहुत पर उपलब्ध नहीं है है।

1

मेरे खोल स्क्रिप्ट:

#!/bin/bash 
awk -v line=$1 -v new_content="$2" '{ 
     if (NR == line) { 
       print new_content; 
     } else { 
       print $0; 
     } 
}' $3 

तर्क:

first: line number you want change 
second: text you want instead original line contents 
third: file name 

यह स्क्रिप्ट प्रिंट उत्पादन तो stdout पर रीडायरेक्ट करने की जरूरत है। उदाहरण:

./script.sh 5 "New fifth line text!" file.txt 

आप, यह सुधार कर सकते हैं देखभाल है कि आपके सभी तर्कों मूल्यों की उम्मीद है लेने के द्वारा उदाहरण के लिए।

संबंधित मुद्दे

 संबंधित मुद्दे