2011-05-02 15 views
11

को प्रतिस्थापित करता है, मैं फ़ाइल के HTML तत्व की हर दूसरी घटना को प्रतिस्थापित करने के लिए sed का उपयोग करने की कोशिश कर रहा हूं ताकि मैं वैकल्पिक रंग पंक्तियां बना सकूं।Sed प्रत्येक nth घटना

यहां मैंने जो कोशिश की है और यह काम नहीं करता है।

sed 's/<tr valign=top>/<tr valign=top bgcolor='#E0E0E0'>/2' untitled.html 

उत्तर

10

मैं awk साथ इसे हल चाहते हैं:

awk '/<tr valign=top>/&&v++%2{sub(/<tr valign=top>/, "<tr valign=top bgcolor='#E0E0E0'>")}{print}' untitled.html 

सबसे पहले, यह सत्यापित करता है, तो लाइन <tr valign=top>

/<tr valign=top>/&&v++%2 

और क्या <tr valign=top> एक अजीब पाया उदाहरण है शामिल हैं:

v++%2 

यदि हां, तो यह लाइन

{sub(/<tr valign=top>/, "<tr valign=top bgcolor='#E0E0E0'>")} 

चूंकि सभी पंक्तियां मुद्रित करने के लिए कर रहे हैं में <tr valign=top> बदल देता है, वहाँ एक ब्लॉक कि हमेशा (सभी लाइनों के लिए) निष्पादित किया जाएगा और मौजूदा लाइन प्रिंट होगा है:

{print} 
3

यह मेरे लिए काम करता है:

sed -e "s/<tr/<TR bgcolor='#E0E0E0'/g;n" simpletable.htm 

नमूना इनपुट:

<table> 
    <tr><td>Row1/col1</td><td>col2</td><td>col3</td></tr> 
    <tr><td>Row2/col1</td><td>col2</td><td>col3</td></tr> 
    <tr><td>Row3/col1</td><td>col2</td><td>col3</td></tr> 
    <tr><td>Row4/col1</td><td>col2</td><td>col3</td></tr> 
    <tr><td>Row5/col1</td><td>col2</td><td>col3</td></tr> 
</table> 

नमूना उत्पादन:

<table> 
    <TR bgcolor='#E0E0E0'><td>Row1/col1</td><td>col2</td><td>col3</td></tr> 
    <tr><td>Row2/col1</td><td>col2</td><td>col3</td></tr> 
    <TR bgcolor='#E0E0E0'><td>Row3/col1</td><td>col2</td><td>col3</td></tr> 
    <tr><td>Row4/col1</td><td>col2</td><td>col3</td></tr> 
    <TR bgcolor='#E0E0E0'><td>Row5/col1</td><td>col2</td><td>col3</td></tr> 
</table> 

कुंजी एसईडी में n आदेश है, जो अगली पंक्ति में अग्रिम उपयोग करने के लिए है। यह केवल तभी काम करता है जब टीआर अलग-अलग रेखाओं पर कब्जा कर लेता है। यह नेस्टेड टेबल के साथ तोड़ देगा, या यदि एक लाइन पर एकाधिक टीआर हैं।

+0

इसके अलावा, यह आदेश केवल तभी काम करता है जब 'tr की पंक्ति में छोड़कर कुछ भी नहीं है, है ना? 'Tr' एक ही पंक्ति में शुरू और समाप्त होना चाहिए और उनके बीच खाली रेखाएं नहीं होनी चाहिए। क्या मैं सही हू? (फिर भी, मैं आपके समाधान को बहुत ही निर्देशक बना देता हूं क्योंकि मुझे 'n' कमांड में उपयोग नहीं किया जाता है)। – brandizzi

+0

यह हर विषम घटना को प्रतिस्थापित करता है, लेकिन हर घटना के लिए इसे कैसे बदला जाए? – Offenso

0

http://www.linuxquestions.org/questions/programming-9/replace-2nd-occurrence-of-a-string-in-a-file-sed-or-awk-800171/

के अनुसार यह कोशिश करो।

sed '0,/<tr/! s/<tr/<TR bgcolor='#E0E0E0'/' file.txt 

विस्मयादिबोधक चिह्न पहले "जैक" के लिए फ़ाइल की शुरुआत से सब कुछ को नकारता है, ताकि प्रतिस्थापन सभी निम्नलिखित लाइनों पर चल रही है। ध्यान दें कि मेरा मानना ​​है कि यह केवल एक gnu sed ऑपरेशन है।

यदि आपको केवल दूसरी घटना पर काम करने की आवश्यकता है, और किसी भी आगामी मैचों को अनदेखा करें, तो आप एक नेस्टेड अभिव्यक्ति का उपयोग कर सकते हैं।

sed '0,/<tr/! {0,/<tr/ s/<tr/<TR bgcolor='#E0E0E0'/}' file.txt 

यहाँ कोष्ठक किए अभिव्यक्ति पहले भाग के उत्पादन पर कार्यवाही करेंगे, लेकिन इस मामले में, यह पहली मिलान "जैक" परिवर्तित करने के बाद बाहर निकल जाएगा।

पीएस, मुझे इस तरह के मामलों में बहुत उपयोगी होने के लिए sed faq मिला है।