बैश में, मैं एक फ़ाइल में प्रत्येक पंक्ति के बाद एक स्ट्रिंग कैसे जोड़ूं?


112

मैं बैश का उपयोग करके फ़ाइल में प्रत्येक पंक्ति के बाद एक स्ट्रिंग कैसे जोड़ सकता हूं? क्या यह sed कमांड का उपयोग करके किया जा सकता है, यदि हां तो कैसे?

जवाबों:


188

यदि आपका पैरामीटर पैरामीटर के sedमाध्यम से संपादन की अनुमति देता है -i:

sed -e 's/$/string after each line/' -i filename

यदि नहीं, तो आपको एक अस्थायी फ़ाइल बनानी होगी:

typeset TMP_FILE=$( mktemp )

touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/string after each line/' "${TMP_FILE}" > filename

आप touchअस्थायी फ़ाइल क्यों करते हैं ? और मैं मूल sedकी सफलता पर कमांड सशर्त बना सकता हूं cpया खो सकता है।
अगली सूचना तक रोक दिया गया।

मैंने अस्थायी नाम को जल्दी से आरक्षित करने के लिए फाइल को छुआ। इसकी जरूरत नहीं हो सकती है। मुझे लगता है कि आप cp की सफलता पर sed कमांड को सशर्त बनाने के बारे में सही हैं। उस फ़िक्स को बनाने के लिए कोड को एडिट क्यों नहीं किया गया। मैं थोड़ा बुरा नहीं मानूंगा! आपका, टॉम
टॉम डेजीसी

एक लाइन से पहले एक स्ट्रिंग जोड़ने के बारे में क्या ?
ऑक्सीविवि

10
@Oxwivi: sed -e 's/^/string after each line/' -i filename $ का अर्थ है अंत-पंक्ति। ^ का मतलब है लाइन की शुरुआत।
टॉम डेगिसी

अगर मैं sed में पाइप कर रहा हूं, तो sed 's/^/string after each line/'वह होगा जो मैं उम्मीद करूंगा (प्रत्येक पंक्ति के लिए प्रस्तुत sed 's/^/string after each line/'करता है ), लेकिन यह नहीं करता है (यह पूरी पंक्ति को मेरे एपेंड स्ट्रिंग के साथ बदल देता है)। क्या देता है? कोई विचार @TomDeGisi?
दर्शनम

17

मैं उपयोग करना पसंद करता हूं awk। यदि केवल एक कॉलम है, तो उपयोग करें $0, अन्यथा इसे अंतिम कॉलम से बदलें।

एक रास्ता,

awk '{print $0, "string to append after each line"}' file > new_file

या यह,

awk '$0=$0"string to append after each line"' file > new_file

1
इसके अलावा, लाइन नंबरों को जोड़ने के लिए (जैसा कि मेरे मामले में था), कोई भी NRचर का उपयोग कर सकता है:awk '{print $0, NR}'
andrybak

2
@optimus मैंने आपका तरीका आज़मा लिया है, लेकिन एक अतिरिक्त जगह मिलने से उन्हें कैसे हटाया जाए, इस पर कोई विचार नहीं है?
आदिल सजु

@ AdilSaju sed 's/ //g'ने मेरी आवश्यकता के लिए काम किया, लेकिन यह हर पंक्ति में स्थान को हटा देगा, अर्थात gएक पंक्ति में और हर जगह क्या विकल्प होगा ।
एकलव्य

@ AdilSaju कृपया विवरण जोड़ें। एक नया सवाल पूछने के लिए बेहतर है।
ऑप्टिमस प्राइम

@AdilSaju awk निकालें , की तरह {print $0"string to append after each line"}
कलिप


4
  1. शुद्ध POSIX खोल और sponge:

    suffix=foobar
    while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file | 
    sponge file
  2. xargsऔर printf:

    suffix=foobar
    xargs -L 1 printf "%s${suffix}\n" < file | sponge file
  3. का उपयोग कर join:

    suffix=foobar
    join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
  4. शैल उपकरण का उपयोग कर paste, yes, head और wc:

    suffix=foobar
    paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file

    ध्यान दें कि इससे पहले pasteएक टैब चार सम्मिलित करता है $suffix

बेशक spongeएक अस्थायी फ़ाइल के साथ बदला जा सकता है, बाद mvमें मूल फ़ाइलनाम के ऊपर, कुछ अन्य उत्तरों के साथ ...


1
sedजब तक संसाधन बहुत सीमित नहीं हैं, इनमें से कोई भी बेहतर नहीं है ।
'17:

मुझे गैर-सेड समाधान पसंद है। sedइस तरह के एक सरल काम के लिए आवश्यक नहीं है।
ब्रूस

1

मैं पसंद करता हूं echo। शुद्ध बैश का उपयोग करना:

cat file | while read line; do echo ${line}$string; done

-9

सैड थोड़ा बदसूरत है, आप इसे इतने अच्छे से कर सकते हैं:

hendry@i7 tmp$ cat foo 
bar
candy
car
hendry@i7 tmp$ for i in `cat foo`; do echo ${i}bar; done
barbar
candybar
carbar

2
शेल की अधिकतम तर्क सीमा की तुलना में अधिक लाइनों वाली फ़ाइलों के लिए विफल। कोशिश करें: बिल्ली फू | पढ़ते समय ए; गूंज $ {a} बार; किया या ऐसा कुछ इसके बजाय; यह ज्यादातर मामलों में के लिए एक उपयुक्त प्रतिस्थापन है।
एलेक्स

1
यह उन स्थानों के साथ लाइनों के लिए भी विफल रहता है।
अगली सूचना तक रोक दिया गया।

1
एर, नहीं यह डेनिस विफल नहीं है। शेल की अधिकतम तर्क सीमा? क्राइक आप पेंडेंट हो रहे हैं।
प्रात:

हाँ, यह करता है: $ बिल्ली फू फू बार बाज एलेक्स @ संधि: ~ मैं के लिए $ cat foo; गूंज $ {i} बार; फ़ॉबर बारबार बज़बार किया लेकिन कुछ परीक्षणों के बाद, मैं अपने तर्क के बारे में गलत हो सकता हूं, लेकिन डेनिस सही है
एलेक्स

3
@hendry हाँ, यह उन में रिक्त स्थान वाली रेखाओं के लिए विफल रहता है, जैसे कि echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)2 रेखाएँ प्रिंट करती हैं, जबकि इनपुट 1 पंक्ति है foo bar(और catफ़ाइल के बजाय स्टडिन से पढ़ना इसके लिए कोई अंतर नहीं है)।
हाइड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.