sed

2010-03-25 10 views
8

के साथ लाइन जैसे कई लाइनों के साथ एक सादा पाठ दस्तावेज़ दिए गए के अंत में जोड़ें:sed

c48 7.587 7.39 
c49 7.508 7.345983 
c50 5.8 7.543 
c51 8.37454546 7.34 

2 रिक्त स्थान पंक्ति के अंत के बाद कुछ जानकारी जोड़ने की जरूरत है, ताकि प्रत्येक पंक्ति के लिए मैं करूंगा प्राप्त करें:

c48 7.587 7.39 def 
c49 7.508 7.345983 def 
c50 5.8 7.543 def 
c51 8.37454546 7.34 def 

मुझे हजारों फाइलों के लिए ऐसा करने की ज़रूरत है। मुझे लगता है कि sed के साथ करना संभव है, लेकिन यह नहीं पता कि कैसे करें। कोई संकेत? क्या आप मुझे इस मामले के लिए ट्यूटोरियल या टेबल के साथ कुछ लिंक भी दे सकते हैं?

धन्यवाद

उत्तर

14

पर sed प्रलेखन जानें कि आपका सभी फाइलों को एक निर्देशिका में हैं

sed -i.bak 's/$/ def/' *.txt 

यह पुनरावर्ती (जीएनयू लगता है) करने के लिए

find /path -type f -iname '*.txt' -exec sed -i.bak 's/$/ def/' "{}" +; 

आप परिचय के लिए here देख सकते हैं से sed

अन्य तरीकों y कहां उपयोग कर सकते हैं,

awk

for file in * 
do 
    awk '{print $0" def"}' $file >temp 
    mv temp "$file" 
done 

बैश खोल

for file in * 
do 
    while read -r line 
    do 
     echo "$line def" 
    done < $file >temp 
    mv temp $file 
done 
+1

'+;' क्या है? मैं हमेशा '\;' का उपयोग करता हूं। बैश मैनपेज मुझे कोई बुद्धिमान नहीं बनाता है। – Thomas

+0

वहां जीएनयू 'ढूंढ' मैन पेज में है। इसके बराबर 'xargs' – ghostdog74

+0

हाय, अजीब एक अच्छा है। बस एक छोटा सवाल, कैसे '{प्रिंट $ 0 "def"}' $ file> temp फ़ाइल की कंक्रीट लाइन संख्या पर लागू किया जा सकता है? – flow

3
for file in ${thousands_of_files} ; do 
    sed -i ".bak" -e "s/$/ def/" file 
done 

यहाँ कुंजी s/// आदेश खोज एवं प्रतिस्थापन है। यहां हम 2 रिक्त स्थान और आपकी स्ट्रिंग के साथ $ लाइन के अंत को प्रतिस्थापित करते हैं।

http://sed.sourceforge.net/#docs

+0

बहुत बहुत शुक्रिया। सिर्फ एक प्रश्न, ओएसएक्स पर ऐसा करने से, चरित्र "^ एम" क्यों दिखाई देता है? – flow

+0

आईआईआरसी, अंत-ऑफ-लाइन - यूनिक्स, मैक और विंडोज़ में ईओएल एंड कैरेक्टर सभी अलग हैं। 'sed' एक यूनिक्स उपयोगिता है, इसलिए यह यूनिक्स सम्मेलन का उपयोग करता है, यानी कैरिज रिटर्न - सीआर (^ एम) के साथ प्रत्येक पंक्ति को समाप्त करता है, जबकि मैक लाइन फीड - एलएफ (^ एल) का उपयोग करता है, विंडोज बीटीडब्ल्यू सीआर, एलएफ का उपयोग करता है। बिंदु यह है कि आपको यूनिक्स ईओएल चरित्र के साथ छोड़ दिया गया है। मैं मैक गुरु नहीं हूं, लेकिन इसे ठीक करने के लिए उपयोगिता होनी चाहिए। मेरे लिनक्स बॉक्स पर 'dos2unix' और' unix2dos' है, लेकिन यदि आपको ऐसा टूल नहीं मिल रहा है, तो समान प्रभाव प्राप्त करने के लिए 'tr' \ r '' \ f'' 'का उपयोग करने का प्रयास करें। –

+0

एक नोट, मैक ने ओएस एक्स तक सीआर (^ एम) ('\ r') का उपयोग किया, जिस बिंदु पर उन्होंने एलएफ (^ एल) ('\ n') पर स्विच किया। यूनिक्स ने हमेशा एलएफ (^ एल) का उपयोग किया है। जब आप कहते हैं कि विंडोज सीआरएलएफ (^ एम^एल) ("\ r \ n") का उपयोग करता है तो आप सही होते हैं। – amertune