Bagaimana cara menambahkan string setelah setiap baris dalam file menggunakan bash? Bisakah itu dilakukan dengan menggunakan perintah sed, jika demikian bagaimana?
112
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
touch
file sementara? Dan saya akan membuatsed
perintah bersyarat pada keberhasilancp
atau yang asli bisa hilang.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) tetapised '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,
atau ini,
sumber
NR
variabel:awk '{print $0, NR}'
sed 's/ //g'
ini berfungsi untuk kebutuhan saya, tetapi itu akan menghapus ruang di setiap baris, itulah opsig
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:
sumber
Shell POSIX murni dan
sponge
:xargs
danprintf
:Menggunakan
join
:Alat shell menggunakan
paste
,yes
,head
&wc
:Perhatikan bahwa
paste
menyisipkan karakter Tab sebelumnya$suffix
.Tentu saja
sponge
dapat diganti dengan file temp, kemudian dimv
atas nama file asli, seperti beberapa jawaban lain ...sumber
sed
, kecuali sumber daya sangat terbatas.sed
tidak diperlukan untuk pekerjaan sederhana seperti itu.Saya lebih suka
echo
. menggunakan pesta murni:sumber
Sed agak jelek, Anda bisa melakukannya dengan elegan seperti ini:
sumber
cat foo
; lakukan echo $ {i} bar; dilakukan foobar barbar bazbar tetapi setelah beberapa tes, saya mungkin salah tentang alasan saya, tetapi Dennis benarecho "foo bar" | (for i in `cat`; do echo ${i}bar; done)
yang mencetak 2 baris meskipun inputnya 1 barisfoo bar
(dancat
membaca dari stdin alih-alih file tidak membuat perbedaan untuk ini).