Saya memiliki pola berikut dalam string (alamat IP):
123.444.888.235
Saya ingin mengganti angka terakhir setelah titik dengan 0
, sehingga menjadi:
123.444.888.0
Bagaimana saya bisa melakukannya dalam bash
bahasa shell script lain?
bash
shell-script
string
Ari
sumber
sumber
Jawaban:
Dalam setiap shell POSIX:
${var%pattern}
adalah operator yang diperkenalkan olehksh
pada tahun 80an, distandarisasi oleh POSIX untuksh
bahasa standar dan sekarang diimplementasikan oleh semua shell yang menafsirkan bahasa itu, termasukbash
.${var%pattern}
memperluas ke konten$var
dilucuti dari string terpendek yang cocok dengan pola dari ujungnya (atau sama seperti$var
jika pola itu tidak cocok). Jadi${var%.*}
(di mana.*
merupakan pola yang berarti dot diikuti oleh sejumlah karakter) memperluas ke$var
tanpa-paling tepat.
dan apa yang mengikutinya. Sebaliknya, di${var%%.*}
mana string terpanjang yang cocok dengan pola dilucuti akan diperluas ke$var
tanpa yang paling kiri.
dan apa yang mengikutinya.sumber
${var%.*}
man bash
dan tekan enter, lalu ketik/suffix pattern
dan tekan enter. :)new_var="${var%.*}.0"
... nJoy !.Ini seharusnya bekerja.
Perhatikan bahwa bidang
sed
substitusi terakhir\10
,, adalah pola yang cocok pertama kali (\1
), disatukan dengan nol literal.sumber
Beberapa cara (ini semua mengasumsikan bahwa Anda ingin mengubah set angka terakhir dalam string):
Di sini,
-F'.'
diperintahkanawk
untuk digunakan.
sebagai pemisah bidang input dan-vOFS='.'
menggunakannya sebagai pemisah bidang keluaran. Kemudian, kami hanya mengatur bidang terakhir ($NF
) ke 0 dan mencetak garis (1;
adalahawk
singkatan untuk "mencetak baris saat ini").The
-p
memberitahuperl
untuk mencetak setiap baris masukan setelah menerapkan script yang diberikan oleh-e
. Script itu sendiri hanyalah operator substitusi sederhana yang akan menggantikan satu atau lebih angka di akhir baris0
.Gagasan yang sama
sed
, menggunakan[0-9]
alih-alih\d
.Jika string Anda dalam variabel dan Anda menggunakan shell yang mendukung string di sini (seperti
bash
atauzsh
misalnya), Anda dapat mengubah hal di atas menjadi:sumber
Kasus umum untuk menerapkan netmask ke alamat IP:
Karena input Anda adalah alamat IP, dan Anda mengganti oktet terakhir dari alamat itu
.0
, maka saya berasumsi apa yang benar - benar ingin Anda capai adalah menghitung bagian jaringan dari alamat IP, menggunakan255.255.255.0
netmask.Mengganti oktet dengan nol tidak masalah jika panjang netmask Anda dapat dibagi 8, tetapi ini bukan kasus umum. Jika Anda perlu melakukan operasi ini untuk netmask (subnet) yang valid, maka Anda dapat melakukan sesuatu seperti ini:
Ini mendefinisikan 3 fungsi:
d2i()
mengubah bentuk desimal bertitik dari alamat IP (atau mask) menjadi integer sederhanai2d()
melakukan yang sebaliknya - mengonversi bilangan bulat sederhana ke desimal bertitikipmask()
hanya menghitung bitwise AND dari alamat dan netmask untuk memberikan bagian jaringan dari alamat. Bash mengharapkan operan&
menjadi bilangan bulat.Dua panggilan untuk
ipmask
menunjukkan bagaimana jaringan dapat dihitung dari alamat IP untuk dua topeng yang berbeda.Catatan seperti yang dinyatakan dalam pertanyaan,
123.444.888.235
adalah alamat IP yang tidak valid.123.44.88.235
Sebagai gantinya saya menggunakan contoh-contoh ini.sumber
sed
Jawaban alternatif :Ini mengelompokkan semuanya hingga titik terakhir dan mengganti baris penuh dengan konten grup diikuti oleh 0.
Saya menggunakan -r untuk menghindari keharusan melarikan diri kurung.
sumber