2011-04-21 12 views
5

मुझे पता है कि कैसे मैं पूरी file.For उदाहरण में खोजा गया पैटर्न की पहली घटना जगह ले सकता है चाहते हैं,एक फ़ाइल में श्रृंखला का पहला प्रतिस्थापन sed का उपयोग

import java.io.File; 
import java.io.File; 

द्वारा प्रतिस्थापित किया जाना चाहिए
import java.io.IOException; 
import java.io.File; 

मैं इसे sed का उपयोग करके कैसे प्राप्त करूं? धन्यवाद

+0

के संभावित डुप्लिकेट (http://stackoverflow.com/questions/148451/how करने के लिए उपयोग-sed करने वाली की जगह-केवल-पहली घटना में एक-फाइल) –

उत्तर

0

आप एक खोल स्क्रिप्ट (बैश)

#!/bin/bash 

declare -i toggle=0 
while read -r line 
do 
     case "$line" in 
      *import*java.io.File*) 
      if [ $toggle -eq 1 ];then 
       echo "$line" 
       continue 
      fi 
      echo "import java.io.Exception"; 
      toggle=1 
      continue 
      ;; 
     esac 
     echo "$line" 
done < file 

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

$> more file 
import java.util.Scanner; 
import java.io.File; 
import java.io.File; 

$> bash search_replace.sh 
import java.util.Scanner; 
import java.io.Exception 
import java.io.File; 

उपयोग कर सकते हैं या आप स्मृति में पूरी फ़ाइल slurp और एक बार प्रतिस्थापन कर सकते हैं

data=$(<file) 
echo "${data/import java.io.File;/import java.io.IOException}" 
0

बस इसे कमांड लाइन पर नीचे करें:

cat text.txt | 
awk '/File/{ 
    if (count < 1){ gsub("File","IOException")} 
    count++ 
    print 
    }' 
2

निश्चित रूप से कुछ बड़ी लंबी लिपि लिखने की आवश्यकता नहीं है जब यह केवल एक पंक्ति में सभी काम करने के लिए प्रतिस्थापन पर ले जाती है। आपको नौकरी के लिए सही पावर टूल चुनना है।

यहाँ एक पर्ल एक लाइनर है:

% cat -n /tmp/f 
    1 import java.lang.Character; 
    2 import java.io.File; 
    3 import java.io.File; 
    4 import java.util.Pattern; 

% perl -pe 's//IoException/ if m?import java\.io\.\KFile?' /tmp/f 
import java.lang.Character; 
import java.io.IoException; 
import java.io.File; 
import java.util.Pattern; 

और अगर आप फ़ाइल के किसी संपादन के साथ यह करने के लिए, चाहते हैं तो बस -i.bak जोड़ें:

% perl -i.bak -pe 's//IoException/ if m?import java\.io\.\KFile?' /tmp/f 

% head /tmp/f{,.bak} 
==> /tmp/f <== 
import java.lang.Character; 
import java.io.IoException; 
import java.io.File; 
import java.util.Pattern; 

==> /tmp/f.bak <== 
import java.lang.Character; 
import java.io.File; 
import java.io.File; 
import java.util.Pattern; 

कारण यह काम इसलिए है क्योंकि जब आप m// ऑपरेटर को ?? डिलीमीटर देते हैं, तो इसमें कुछ अंतर्निहित स्थिति केवल पहली बार मेल खाने के लिए याद रखती है।

फिर विकल्प में, खाली पैटर्न का मतलब अंतिम मिलान पैटर्न का पुन: उपयोग करना है, इसलिए आपको इसे फिर से टाइप करने और दो अलग-अलग खतरे में डालने की आवश्यकता नहीं है।

अंत में, पैटर्न में \K पैटर्न में दोबारा सामान रखता है, ताकि सामान को बाईं ओर रखा जा सके, ताकि यह विकल्प द्वारा गब्बल नहीं किया जा सके।

2
cat file | sed -e ':l 
    0,/my_search_str/ { 
    /my_search_str/! { 
      N; 
      b l 
      } 
    s/my_search_str/replace_this/g 
    :t 
    N 
    b t  
    } 
    ' 
इस

मेरे लिए काम कर रहा है: फ़ाइल: (पहले)

hello1 
my_search_str 
hello2 
mysearch_str 
hello3 

फ़ाइल: (के बाद)

hello1 
replace_this 
hello2 
mysearch_str 
hello3 
1

एक में सभी लाइनों संलग्न करने के लिए मुझे क्या होता है महान रेखा और सामग्री को प्रतिस्थापित करें।

$ cat f 
import java.io.File; 
import java.io.File; 
$ sed -n 'N 
    ${ 
    s/import java.io.File;/import java.io.IOException/ 
    p 
    }' f 
import java.io.IOException 
import java.io.File; 

यह कैसे काम करता है: पहला, मैं लाइन मुद्रण, जो डिफ़ॉल्ट व्यवहार है, SED को -n विकल्प गुजर दबाने।

फिर sed commandss आता है।पहला वाला N कमांड है: यह पैटर्न की जगह पर बनाए रखने के लिए वर्तमान की ओर एक नई लाइन और स्ट्रीम की अगली पंक्ति जोड़ता है। यह वर्तमान पंक्ति को अगले में बदल देगा, और फिर अगली पंक्ति को फ़ाइल के अंत तक जोड़ा जाएगा ...।

फ़ाइल के अंत में और N आदेश के बाद अंतिम पंक्ति पर निष्पादित करने के लिए, पैटर्न स्थान में सभी पंक्तियां होंगी। फिर, फ़ाइल के अंत (जो $ पते के द्वारा निर्दिष्ट किया जाता) पर हम सिर्फ साथ वांछित लाइन को बदल दें:

s/import java.io.File;/import java.io.IOException/ 

के बाद से s/// आदेश डिफ़ॉल्ट रूप से पैटर्न अंतरिक्ष में यात्रा के लिए केवल एक प्रतिस्थापन करता है, यह केवल पहली पंक्ति को बदल देगा। अब पैटर्न स्पेस में लाइन बदल दी गई है, लेकिन प्रिंट नहीं किया जाएगा क्योंकि हमने -n विकल्प का उपयोग किया था। इसलिए, हमें p कमांड के साथ इसे प्रिंट करने की आवश्यकता है। एक बार जब हम फ़ाइल के अंत में दो संचालन निष्पादित करेंगे, तो हम इसे $ से संबोधित करेंगे और संचालन को ब्रैकेट्स ({}) के बीच रखें।

वहां, हमने स्पष्टता के लिए एक से अधिक पंक्तियों में सिर्फ sed आदेश प्रस्तुत किए। हम उन्हें एक ही पंक्ति में उपयोग कर सकते हैं; बस अर्धविराम से उन्हें अलग: [? कैसे एसईडी उपयोग करने के लिए एक फ़ाइल में केवल पहली घटना को बदलने के लिए]

$ sed -n 'N;${s/import java.io.File;/import java.io.IOException/;p;}' f 
import java.io.IOException 
import java.io.File; 

HTH

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