2016-01-07 4 views
6

मैं एक पाठ फ़ाइल जिसमें मैं एक नया तार के साथ एक स्ट्रिंग को बदलने के लिए, और फिर जोड़ सकते हैं या उन्हें वर्णों की संख्या समान बनाने के लिए रिक्त स्थान को दूर करना चाहते हैं की समान संख्या के साथ स्ट्रिंग की जगह। उदाहरण के लिए, मैंsed - वर्ण

longer_string  .10 

संक्षेप में साथ

string    .10 

को बदलने के लिए मैं 'स्ट्रिंग' को बदलने के लिए की जरूरत है, और फिर '.10' सही कॉलम में, की संख्या के regarldess करना चाहते हैं प्रतिस्थापन स्ट्रिंग में वर्ण।

+0

हाय @ ericvb86 आप इस 'sed -e के/स्ट्रिंग/longer_string/जी 'file.txt' की तरह कुछ मतलब है? –

+0

आप ऐसा करने के लिए एड या विम स्क्रिप्ट के प्रतिस्थापन का उपयोग कर सकते हैं, अन्यथा आप एक स्क्रिप्ट बनाते हैं जो प्रतिस्थापन स्ट्रिंग के आकार मिलान स्ट्रिंग के आकार के बावजूद भिन्न रिक्त स्थान के बावजूद आवश्यक रिक्त स्थान से मेल खाने/प्रतिस्थापित करने के लिए है। – alexscott

+0

रे एलेक्सस्कॉट का जवाब: हाँ, मैं यह कहने जा रहा था कि यह sed से अधिक vi/vim के लिए नौकरी की तरह दिखता है। स्ट्रिंग ('/^स्ट्रिंग') के लिए खोजें, लंबी-स्ट्रिंग के साथ vim-replace (' Rlonger-string ')। मैं इसके लिए सटीक vimscript कोड नहीं जानता; आपको शोध करने की आवश्यकता होगी: https://en.wikipedia.org/wiki/Vim_(text_editor)#Vim_script। –

उत्तर

1

आप sed इस्तेमाल कर सकते हैं प्रतिस्थापन करने के लिए, और फिर शायद column साथ कॉलम फिर से संरेखित?

cat input.txt | sed 's/string/longer_string/g' | column -t 
+1

नोट 'बिल्ली फ़ाइल | sed' एक यूयूओसी है। बेहतर 'sed' ... 'फ़ाइल। – fedorqui

+0

यूएफएलए के साथ क्या है?निजी तौर पर, मुझे बाएं से दाएं प्रवाह के लिए उदाहरण उदाहरण पसंद हैं :) –

+0

सुनिश्चित नहीं है कि यूएफएलए क्या है: डी यूयूओसी http://porkmail.org/era/unix/award.html है:) – fedorqui

1

आप लाइन प्रिंट और एक गाड़ी वापसी संलग्न कर सकते हैं;

while IFS= read -r line; 
do 
    echo -ne "$line\r" 
    echo -ne "longer_string" 
done < file 

तो आपकी फ़ाइल में यह होगा:

$ while IFS= read -r line; do echo -ne "$line\r"; echo -ne "longer_string"; done < file 
longer_string  .10 

नोट इस ठीक काम करता है, तो प्रतिस्थापन स्ट्रिंग मूल से अधिक लंबी है तो, नई लाइन मुद्रित करें। इसके विपरीत, हमें कुछ अतिरिक्त कदम उठाने की आवश्यकता हो सकती है।

0

Sed काम यहाँ के लिए गलत उपकरण है।

क्या आप की जरूरत है:

  1. स्प्लिट शब्द पर काम करने ("स्ट्रिंग" & ".10") और उन्हें चर में स्टोर
  2. वाम-पंथी घटक की लंबाई का पता लगाएं
  3. संशोधित "स्ट्रिंग"
  4. प्रिंट निश्चित चौड़ाई कॉलम में संशोधित तार

यहाँ जाता है:

# 1 
str="string    .10" 
a=$(echo "$str" | awk '{print $1}') 
b=$(echo "$str" | awk '{print $2}') 

# 2 
# note the use of `echo -n` to avoid n+1 errors with `wc`. It does not change anything here because we're subtracting anyway, but if you play around it might bite you. 
str_length=$(echo -n "$str" | wc -c) 
b_length=$(echo -n "$b" | wc -c) 
leftmost_length=$(($str_length - $b_length)) 

# 3 
a="longer_${a}" 

# 4 
printf "%-${leftmost_length}s %-10s\n" "$a" "$b" 
# longer_string  .10 
0

यह आपके लिए (जीएनयू sed) काम कर सकते हैं:

sed -r 's/string(.*)/\nlonger_string\1\n&/;ta;:a;s/\n(\S)(.*\n)./\1\n\2/;ta;s/\n.*\n(.*)/\1/' file 

यह longer_string साथ string बदल देता है और उसके बाद (नई-पंक्तियों पुराने और नए तार के लिए prepended कर रहे हैं) अद्यतन एक के लिए मूल रेखा भी संलग्न । फिर अक्षरों को तब तक हटा दिया जाता है जब तक कि नई स्ट्रिंग का अंत मिलान न हो जाए। पुरानी रेखा से रिक्त स्थान (कम शुरू की गई नई लाइन) फिर संशोधित रेखा के शेष को प्रतिस्थापित करें।