Saya memiliki variabel var
dalam skrip Bash yang memegang string, seperti:
echo $var
"some string.rtf"
Saya ingin menghapus 4 karakter terakhir dari string ini dan menetapkan hasilnya ke variabel baru var2
, jadi
echo $var2
"some string"
Bagaimana saya bisa melakukan ini?
Jawaban:
Pertama, Anda harus eksplisit tentang apa yang Anda inginkan. Jika Anda tahu string berakhir
.rtf
dan Anda ingin menghapusnya.rtf
, Anda dapat menggunakannyavar2=${var%.rtf}
. Jika Anda tidak tahu apa sufiks itu tetapi Anda ingin menghapus semuanya dimulai dengan yang terakhir.
, maka Anda bisa menggunakannyavar2=${var%.*}
. Jika Anda hanya ingin menjaga semuanya tetap up to the first.
, Anda bisa menggunakannyavar2=${var%%.*}
. Dua opsi terakhir memiliki hasil yang sama jika hanya ada satu periode, tetapi jika mungkin ada lebih dari satu periode, Anda harus memutuskan mana yang Anda inginkan.Jika Anda benar-benar ingin selalu menghapus jumlah karakter yang tepat, berikut adalah beberapa opsi.
Anda menentukan bash secara spesifik, jadi kami akan mulai dengan bash builtin. Salah satu yang telah bekerja paling lama adalah sintaks suffix-removal yang sama yang saya gunakan di atas: untuk menghapus empat karakter, gunakan
var2=${var%????}
. Anda perlu satu tanda tanya per karakter dihapus, jadi ini menjadi sulit untuk panjang substring yang lebih besar.Sedikit lebih baru adalah substring ekstraksi:
var2=${var::${#var}-4}
. Di sini Anda dapat meletakkan nomor apa saja4
untuk menghapus sejumlah karakter yang berbeda. (${#var}
Digantikan oleh panjang string, jadi ini sebenarnya meminta untuk menjaga karakter pertama (panjang - 4).)Versi bash yang lebih baru (khususnya 4+, yang berarti yang dikirimkan dengan MacOS tidak berfungsi) memungkinkan Anda menyederhanakannya menjadi adil
var2=${var::-4}
.Jika Anda tidak benar-benar menggunakan bash tetapi beberapa shell tipe POSIX lainnya, penghapusan suffix akan tetap bekerja, bahkan di dasbor lama biasa (di mana tidak ada yang akan melakukannya). Dalam zsh, mereka semua bekerja tetapi Anda harus menempatkan
0
antara titik dua:var2=${var:0:-4}
dll di ksh, Anda memerlukan 0 dan juga harus menggunakan eksplisit panjang-4 ekspresi:var2=${var:0:${#var}-4}
.Anda tentu saja dapat menggunakan substitusi perintah untuk melakukannya dengan bantuan program utilitas; ada banyak yang akan berhasil, tetapi sesuatu seperti
var2=$(cut -c -4 <<<"$var")
mungkin merupakan pilihan terpendek.sumber
Anda bisa melakukan ini:
sumber
bash
4+, tetapi dalam versi sebelumnya Anda dapat menggunakan sedikit lebih lama${v::${#v}-4}
.${v::-4}
croaks "zsh: closure brace diharapkan". Tapi jawaban @fredtantini di bawah ini${v:0:-4}
berfungsi dengan baik.Untuk menghapus empat karakter dari akhir penggunaan string
${var%????}
.Untuk menghapus semuanya setelah akhir
.
digunakan${var%.*}
.sumber
${var#????}
untuk itu.Apa yang berhasil untuk saya adalah:
Tapi saya menggunakannya untuk memangkas baris dalam file sehingga itu terlihat canggung. Penggunaan sebenarnya adalah:
cut
hanya membuat Anda sejauh pemangkasan dari beberapa posisi awal, yang buruk jika Anda membutuhkan baris panjang variabel. Jadi solusi ini membalikkan (rev
) string dan sekarang kita berhubungan dengan posisi akhirnya, kemudian menggunakancut
seperti yang disebutkan, dan membalikkan (lagi,rev
) kembali ke urutan aslinya.sumber
rev
membalikkan garis, bukan string.echo $SOME_VAR | rev | ...
mungkin tidak akan berperilaku seperti yang diharapkan.Menggunakan Variabel ekspansi / penggantian Substring :
Jadi kamu bisa melakukan:
Kalau tidak,
Jika Anda selalu memiliki 4 huruf yang sama
Jika selalu berakhir dengan
.xyz
:Anda juga dapat menggunakan panjang string:
atau sederhana
echo ${var::-4}
sumber
len=${#var}; echo ${var::len-4}
dapat disingkat menjadiecho ${var:0:-4}
:-) EDIT: atau seperti yang ditunjukkan @iyonizer, hanyaecho ${var::-4}
...Anda bisa menggunakan sed,
Contoh:
sumber
var2
?Saya mencoba yang berikut ini dan berhasil untuk saya:
Keluaran:
hel
sumber
Semoga contoh di bawah ini akan membantu,
echo ${name:0:$((${#name}-10))}
->${name:start:len}
start
adalah titik awal stringlen
adalah panjang string yang harus dihapus.Contoh:
Keluaran:
Catatan: Bash 4.2 menambahkan dukungan untuk substring negatif
sumber
Ini bekerja untuk saya dengan menghitung ukuran string.
Sangat mudah Anda perlu mengulangi nilai yang Anda butuhkan untuk kembali dan kemudian menyimpannya seperti di bawah ini
sumber
Dalam hal ini Anda bisa menggunakan nama samaran dengan asumsi Anda memiliki akhiran yang sama pada file yang ingin Anda hapus.
Contoh:
Jika Anda tidak tahu sufiks, dan ingin menghapus semuanya setelah dan termasuk titik terakhir:
% berarti memotong,. adalah apa yang Anda memotong, * adalah wildcard
sumber