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 sedmengizinkan pengeditan di tempat melalui -iparameter:
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
NRvariabel:awk '{print $0, NR}'
sed 's/ //g'ini berfungsi untuk kebutuhan saya, tetapi itu akan menghapus ruang di setiap baris, itulah opsi guntuk 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 filexargsdan printf:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge fileMenggunakan join:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge fileAlat shell menggunakan paste, yes, head
& wc:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
Perhatikan bahwa pastemenyisipkan karakter Tab sebelumnya $suffix.
Tentu saja spongedapat diganti dengan file temp, kemudian di mvatas nama file asli, seperti beberapa jawaban lain ...
sed, kecuali sumber daya sangat terbatas.
sedtidak 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 catmembaca dari stdin alih-alih file tidak membuat perbedaan untuk ini).
touchfile sementara? Dan saya akan membuatsedperintah bersyarat pada keberhasilancpatau yang asli bisa hilang.