Saya sedang belajar awk
dan saya ingin tahu apakah ada opsi untuk menulis perubahan ke file, mirip dengan di sed
mana saya akan menggunakan -i
opsi untuk menyimpan modifikasi ke file.
Saya mengerti bahwa saya bisa menggunakan pengalihan untuk menulis perubahan. Namun apakah ada opsi awk
untuk melakukan itu?
Jawaban:
Dalam GNU Awk terbaru (sejak 4.1.0 dirilis ), ia memiliki opsi untuk mengedit file "inplace" :
Contoh penggunaan:
Untuk menyimpan cadangan:
sumber
inplace
sebenarnya perpustakaan yang disertakan dengangawk
menurut jawaban iiSeymour , jadiinplace
adalah sesuatu yang dapat dimasukkan sebagaiincludefile
.Kecuali Anda memiliki GNU awk 4.1.0 atau yang lebih baru ...
Anda tidak akan memiliki opsi seperti opsi sed,
-i
melainkan lakukan:Catatan:
-i
ini bukan sihir, itu juga membuat file sementarased
hanya menanganinya untuk Anda.Pada GNU awk 4.1.0 ...
GNU awk
menambahkan fungsionalitas ini dalam versi 4.1.0 (dirilis 10/05/2013) . Ini tidak lurus ke depan seperti hanya memberikan-i
opsi seperti yang dijelaskan dalam catatan yang dirilis:Anda harus menggunakan
inplace.awk
file include yang dibundel untuk menjalankan ekstensi dengan benar seperti:Variabel
INPLACE_SUFFIX
dapat digunakan untuk menentukan ekstensi untuk file cadangan:Saya senang fitur ini telah ditambahkan tetapi bagi saya, pelaksanaannya sangat tidak awkish sebagai kekuatan berasal dari keringkasan bahasa dan
-i inplace
adalah 8 karakter terlalu lama imo .Ini adalah tautan ke manual untuk kata resmi.
sumber
awk '{ gsub(/foo/, "bar" ) } ; { print $0 }' file > tmp.txt && mv -v tmp.txt file
:?awk '{print $0}' file | sponge file
menggunakan lebih pendeksponge
darimoreutils
.@sudo_O memiliki jawaban yang benar .
Ini tidak bisa:
Shell melakukan pengalihan sebelum menyerahkan kontrol ke beberapa proses ( pengalihan ). The
>
redirection akan memotong file ke nol ukuran ( mengalihkan keluaran ). Oleh karena itu, pada saat suatu proses diluncurkan dan ingin membaca dari file, tidak ada data untuk dibaca.sumber
hanya sedikit retasan yang berfungsi
sumber
Alternatifnya adalah menggunakan
sponge
:Di mana Anda mengganti
'{print $0}'
dengan skrip awk Anda danyour_file
dengan nama file yang ingin Anda sunting.sponge
menyerap sepenuhnya input sebelum menyimpannya ke file.sumber
sponge
adalah bagian darimoreutils
. Jadi itu tidak akan ada secara default di sebagian besar sistem. Tapi sepertinya setidaknyasponge
itu sendiri cukup portabel dan dapat dijalankan hampir di mana-mana.tee
-berbasis adalah bahwasponge
akan membaca segalanya untuk RAM sebelum menulis, maka itu akan membeku pada file besar.mengikuti tidak akan berhasil
ini seharusnya bekerja
sumber
Jika Anda menginginkan solusi awk-only tanpa membuat file sementara dan dapat digunakan dengan versi! = (Gawk 4.1.0):
sumber
Menggunakan tee
yang
tee
tempat perintah take dan dieksekusi setelahawk
perintah selesai karena|
.sumber