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 sed
aracı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
NR
değ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 file
xargs
ve printf
:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge file
Kullanarak join
:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
Kabuk araçları kullanılarak paste
, yes
, head
ve wc
:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
Not paste
Bir ekler Tab önce kömürü $suffix
.
Elbette sponge
geçici bir dosya ile değiştirilebilir, daha sonra mv
diğer bazı cevaplarda olduğu gibi orijinal dosya adı üzerine ...
sed
Kaynaklar çok sınırlı olmadıkça bunların hiçbiri tercih edilmez.
sed
bu 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 cat
dosya yerine stdin'den okumak bunun için bir fark yaratmaz ).
touch
geçici dosya yapıyorsun ? Vesed
emri, başarısına koşullu yapardımcp
veya orijinal kaybedilebilirdi.