Bash kullanarak bir dosyadaki her satırdan sonra nasıl bir dize eklerim? Sed komutu kullanılarak yapılabilir, eğer öyleyse nasıl?
Bash kullanarak bir dosyadaki her satırdan sonra nasıl bir dize eklerim? Sed komutu kullanılarak yapılabilir, eğer öyleyse nasıl?
Yanıtlar:
Parametre sedaracılığıyla yerinde düzenlemeye izin verirseniz -i:
sed -e 's/$/string after each line/' -i filename
Değilse, geçici bir dosya oluşturmanız gerekir:
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 $ satır sonu anlamına gelir. ^ satırın başlangıcı anlamına gelir.
sed 's/^/string after each line/'ben (her satıra prepends) beklediğiniz ama ne yapar sed 's/^/string after each line/'değil (benim ekleme dizeyle bütün çizgi yerine geçer) gelmez. Ne oluyor? @TomDeGisi herhangi bir fikir?
Kullanmayı tercih ederim awk. Yalnızca bir sütun varsa kullanın $0, yoksa son sütunla değiştirin.
Tek yön,
awk '{print $0, "string to append after each line"}' file > new_file
veya bu,
awk '$0=$0"string to append after each line"' file > new_file
NRdeğişken kullanılabilir:awk '{print $0, NR}'
sed 's/ //g'bu benim ihtiyacım için çalıştı, ancak her satırdaki boşluğu kaldıracak, bu g, bir satırdaki her yerde ve her yerde seçenek .
, gibi {print $0"string to append after each line"}.
Elinizde varsa, lam (laminat) yardımcı programı bunu yapabilir, örneğin:
$ lam filename -s "string after each line"
Saf POSIX kabuğu ve sponge:
suffix=foobar
while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file |
sponge filexargsve printf:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge fileKullanarak join:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge fileKabuk araçları kullanılarak paste, yes, head
ve wc:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
Not pasteBir ekler Tab önce kömürü $suffix.
Elbette spongegeçici bir dosya ile değiştirilebilir, daha sonra mvdiğer bazı cevaplarda olduğu gibi orijinal dosya adı üzerine ...
sedKaynaklar çok sınırlı olmadıkça bunların hiçbiri tercih edilmez.
sedbu kadar basit bir iş için gerekli değildir.
Tercih ederim echo. saf bash kullanarak:
cat file | while read line; do echo ${line}$string; done
Sed biraz çirkin, böyle zarifçe yapabilirsin:
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; do echo $ {i} çubuğu; foobar barbar bazbar yaptım ama bazı testlerden sonra mantığım konusunda yanılıyor olabilirim, ama Dennis haklı
echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)giriş 1 satır olmasına rağmen 2 satır yazdıran satırlar gibi boşluklar olan satırlar için bu başarısız olur foo bar(ve catdosya yerine stdin'den okumak bunun için bir fark yaratmaz ).
touchgeçici dosya yapıyorsun ? Vesedemri, başarısına koşullu yapardımcpveya orijinal kaybedilebilirdi.