Saya memiliki situasi di mana saya ingin skrip bash untuk mengganti seluruh baris dalam file. Nomor baris selalu sama, sehingga bisa menjadi variabel hard-coded.
Saya tidak mencoba mengganti beberapa sub-string di baris itu, saya hanya ingin mengganti baris itu sepenuhnya dengan baris baru.
Apakah ada metode bash untuk melakukan ini (atau sesuatu yang sederhana yang dapat dilemparkan ke dalam skrip .sh).
sed: -e expression #1, char 26: unknown option to ``s'
dan garis saya adalah:sed -i '7s/.*/<param-value>http://localhost:8080/ASDF/services/REWS.REWSHttpSoap12Endpoint/</param-value>/' $TCE_SVN_HOME\trunk\tce\EWC\WebContent\WEB-INF\web.xml
. Ada ide?/
dalam teks pengganti akan ditafsirkan sebagai garis miring penutup daris
perintah kecuali lolos (\/
). Namun, hal termudah untuk dilakukan adalah memilih karakter yang berbeda dan tidak digunakan sebagai pembatas. Sebagai contohsed -i '7s{.*}{<param-value>http://...}' $TCE_SVN_HOME/trunk...
,.s
menentukan pembatas. Jadi untuk mengubah perintah Anda menggunakan misalnya#
akan seperti ini:sed -i '7s#.*#<param-value>http://localhost:8080/ASDF/services/REWS.REWSHttpSoap12Endpoint/</param-value>#'
-e
if jika-i
diberikan, juga; dengan demikian, perintah yang benar menjadi:sed -e 'Ns/.*/replacement-line/' -i '' file.txt
Saya sebenarnya menggunakan skrip ini untuk mengganti sebaris kode dalam file cron di server UNIX perusahaan kami beberapa waktu lalu. Kami menjalankannya sebagai skrip shell normal dan tidak memiliki masalah:
Ini tidak sesuai dengan nomor baris, tetapi Anda dapat dengan mudah beralih ke sistem berbasis nomor baris dengan meletakkan nomor baris sebelum
s/
dan menempatkan wildcard di tempatthe_original_line
.sumber
sed -e "s/.../.../" /dir/file > /dir/temp_file
sed -e "s/.../.../" /dir/file > /dir/file
Misalkan Anda ingin mengganti baris 4 dengan teks "berbeda". Anda dapat menggunakan AWK seperti:
AWK menganggap input sebagai "catatan" dibagi menjadi "bidang". Secara default, satu baris adalah satu catatan.
NR
adalah jumlah catatan yang terlihat.$0
mewakili catatan lengkap saat ini (sementara$1
adalah bidang pertama dari catatan dan sebagainya; secara default bidang adalah kata-kata dari baris).Jadi, jika nomor baris saat ini adalah 4, cetak string "berbeda" tetapi cetak baris tidak berubah.
Dalam AWK, kode program terlampir di
{ }
jalankan sekali pada setiap catatan input.Anda perlu mengutip program AWK dalam tanda kutip tunggal untuk menjaga shell dari mencoba menafsirkan hal-hal seperti
$0
.EDIT: Program AWK yang lebih pendek dan lebih elegan dari @chepner di komentar di bawah:
Hanya untuk catatan (yaitu baris) nomor 4, ganti seluruh rekaman dengan string "berbeda". Kemudian untuk setiap record input, cetak record.
Jelas keterampilan AWK saya berkarat! Terima kasih, @ chepner.
Sunting: dan lihat juga versi yang lebih pendek dari @Dennis Williamson:
Cara ini dijelaskan dalam komentar:
1
selalu bernilai true, sehingga blok kode yang terkait selalu berjalan. Tetapi tidak ada blok kode yang terkait, yang berarti AWK melakukan tindakan standarnya hanya dengan mencetak seluruh baris. AWK dirancang untuk memungkinkan program singkat seperti ini.sumber
awk 'NR==4 {$0="different"} { print }' input_file.txt
.awk 'NR==4 {$0="different"}1' input_file.txt
1
dilakukan trailing itu? (Catatan: Saya mengujinya dan itu memang berhasil! Saya hanya tidak mengerti caranya.)Diberikan file tes ini (test.txt)
perintah berikut akan menggantikan baris pertama menjadi "teks baris baru"
Hasil:
informasi lebih lanjut dapat ditemukan di sini
http://www.thegeekstuff.com/2009/11/unix-sed-tutorial-append-insert-replace-and-count-file-lines/
sumber
sed '1 cnewline text' test.txt
akan melakukannya juga.di bash, ganti N, M dengan nomor baris dan xxx yyy dengan apa yang Anda inginkan
EDIT
Sebenarnya dalam solusi ini ada beberapa masalah, dengan karakter "\ 0" "\ t" dan "\"
"\ t", dapat diselesaikan dengan meletakkan IFS = sebelum membaca: "\", di akhir baris dengan -r
tetapi untuk "\ 0", variabel terpotong, tidak ada solusi di bash murni: Tetapkan string yang berisi karakter nol (\ 0) ke variabel di Bash Tetapi dalam file teks normal tidak ada karakter nul \ 0
perl akan menjadi pilihan yang lebih baik
sumber
sumber
Jawaban sempurna dari Chepner. Ini bekerja untuk saya di bash Shell.
di sini
index
- Baris tidaknewLine
- string baris baru yang ingin kita ganti.Demikian pula kode di bawah ini digunakan untuk membaca baris tertentu dalam file. Ini tidak akan mempengaruhi file yang sebenarnya.
di sini
!d
- akan menghapus baris selain dari baris tidak.$index
Jadi kita akan mendapatkan output sebagai string baris tidak$index
dalam file.sumber
${newline}
?Di mac saya gunakan
sumber
Anda bahkan dapat meneruskan parameter ke perintah sed:
test.sh
output orignial. data:
Executing ./test.sh memberikan output.dat baru
sumber
line=5; sed -i "${line}s/.*/replaced by '$i'!/" output.dat