मैं बैश का उपयोग करके फ़ाइल में प्रत्येक पंक्ति के बाद एक स्ट्रिंग कैसे जोड़ सकता हूं? क्या यह sed कमांड का उपयोग करके किया जा सकता है, यदि हां तो कैसे?
मैं बैश का उपयोग करके फ़ाइल में प्रत्येक पंक्ति के बाद एक स्ट्रिंग कैसे जोड़ सकता हूं? क्या यह sed कमांड का उपयोग करके किया जा सकता है, यदि हां तो कैसे?
जवाबों:
यदि आपका पैरामीटर पैरामीटर के 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
sed -e 's/^/string after each line/' -i filename
$ का अर्थ है अंत-पंक्ति। ^ का मतलब है लाइन की शुरुआत।
sed 's/^/string after each line/'
वह होगा जो मैं उम्मीद करूंगा (प्रत्येक पंक्ति के लिए प्रस्तुत sed 's/^/string after each line/'
करता है ), लेकिन यह नहीं करता है (यह पूरी पंक्ति को मेरे एपेंड स्ट्रिंग के साथ बदल देता है)। क्या देता है? कोई विचार @TomDeGisi?
मैं उपयोग करना पसंद करता हूं 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
NR
चर का उपयोग कर सकता है:awk '{print $0, NR}'
sed 's/ //g'
ने मेरी आवश्यकता के लिए काम किया, लेकिन यह हर पंक्ति में स्थान को हटा देगा, अर्थात g
एक पंक्ति में और हर जगह क्या विकल्प होगा ।
,
की तरह {print $0"string to append after each line"}
।
यदि आपके पास यह है, तो लैम (टुकड़े टुकड़े) उपयोगिता इसे कर सकती है, उदाहरण के लिए:
$ lam filename -s "string after each line"
शुद्ध POSIX खोल और sponge
:
suffix=foobar
while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file |
sponge file
xargs
और printf
:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge file
का उपयोग कर join
:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
शैल उपकरण का उपयोग कर paste
, yes
, head
और wc
:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
ध्यान दें कि इससे पहले paste
एक टैब चार सम्मिलित करता है $suffix
।
बेशक sponge
एक अस्थायी फ़ाइल के साथ बदला जा सकता है, बाद mv
में मूल फ़ाइलनाम के ऊपर, कुछ अन्य उत्तरों के साथ ...
sed
जब तक संसाधन बहुत सीमित नहीं हैं, इनमें से कोई भी बेहतर नहीं है ।
sed
इस तरह के एक सरल काम के लिए आवश्यक नहीं है।
मैं पसंद करता हूं echo
। शुद्ध बैश का उपयोग करना:
cat file | while read line; do echo ${line}$string; done
सैड थोड़ा बदसूरत है, आप इसे इतने अच्छे से कर सकते हैं:
hendry@i7 tmp$ cat foo
bar
candy
car
hendry@i7 tmp$ for i in `cat foo`; do echo ${i}bar; done
barbar
candybar
carbar
cat foo
; गूंज $ {i} बार; फ़ॉबर बारबार बज़बार किया लेकिन कुछ परीक्षणों के बाद, मैं अपने तर्क के बारे में गलत हो सकता हूं, लेकिन डेनिस सही है
echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)
2 रेखाएँ प्रिंट करती हैं, जबकि इनपुट 1 पंक्ति है foo bar
(और cat
फ़ाइल के बजाय स्टडिन से पढ़ना इसके लिए कोई अंतर नहीं है)।
touch
अस्थायी फ़ाइल क्यों करते हैं ? और मैं मूलsed
की सफलता पर कमांड सशर्त बना सकता हूंcp
या खो सकता है।