Bagaimana cara menambahkan string setelah setiap baris dalam file menggunakan bash? Bisakah itu dilakukan dengan menggunakan perintah sed, jika demikian bagaimana?
Bagaimana cara menambahkan string setelah setiap baris dalam file menggunakan bash? Bisakah itu dilakukan dengan menggunakan perintah sed, jika demikian bagaimana?
Jawaban:
Jika Anda sed
mengizinkan pengeditan di tempat melalui -i
parameter:
sed -e 's/$/string after each line/' -i filename
Jika tidak, Anda harus membuat file sementara:
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
$ berarti akhir baris. ^ berarti awal baris.
sed 's/^/string after each line/'
melakukan apa yang saya harapkan (ditambahkan ke setiap baris) tetapi sed 's/^/string after each line/'
tidak (menggantikan seluruh baris dengan string tambahan saya). Apa yang memberi? Ada ide @TomDeGisi?
Saya lebih suka menggunakan awk
. Jika hanya ada satu kolom, gunakan $0
, jika tidak ganti dengan kolom terakhir.
Satu arah,
awk '{print $0, "string to append after each line"}' file > new_file
atau ini,
awk '$0=$0"string to append after each line"' file > new_file
NR
variabel:awk '{print $0, NR}'
sed 's/ //g'
ini berfungsi untuk kebutuhan saya, tetapi itu akan menghapus ruang di setiap baris, itulah opsi g
untuk dan di mana-mana dalam satu baris.
,
suka {print $0"string to append after each line"}
.
Jika Anda memilikinya, utilitas lam (laminasi) dapat melakukannya, misalnya:
$ lam filename -s "string after each line"
Shell POSIX murni dan sponge
:
suffix=foobar
while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file |
sponge file
xargs
dan printf
:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge file
Menggunakan join
:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
Alat shell menggunakan paste
, yes
, head
& wc
:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
Perhatikan bahwa paste
menyisipkan karakter Tab sebelumnya $suffix
.
Tentu saja sponge
dapat diganti dengan file temp, kemudian di mv
atas nama file asli, seperti beberapa jawaban lain ...
sed
, kecuali sumber daya sangat terbatas.
sed
tidak diperlukan untuk pekerjaan sederhana seperti itu.
Saya lebih suka echo
. menggunakan pesta murni:
cat file | while read line; do echo ${line}$string; done
Sed agak jelek, Anda bisa melakukannya dengan elegan seperti ini:
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
; lakukan echo $ {i} bar; dilakukan foobar barbar bazbar tetapi setelah beberapa tes, saya mungkin salah tentang alasan saya, tetapi Dennis benar
echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)
yang mencetak 2 baris meskipun inputnya 1 baris foo bar
(dan cat
membaca dari stdin alih-alih file tidak membuat perbedaan untuk ini).
touch
file sementara? Dan saya akan membuatsed
perintah bersyarat pada keberhasilancp
atau yang asli bisa hilang.