hapus karakter tertentu dari variabel menggunakan bash

123

Saya ingin mengurai variabel (dalam kasus saya ini versi pengembangan kit) untuk membuatnya dot ( .) gratis. Jika version='2.3.3', output yang diinginkan adalah 233.

Saya mencoba seperti di bawah ini, tetapi .harus diganti dengan karakter lain yang memberi saya 2_3_3. Akan baik-baik saja jika tr . ''berhasil.

  1 VERSION='2.3.3' 
  2 echo "2.3.3" | tr . _
prayagupd
sumber
10
Tidak, tidak memerlukan: echo "2.3.3" | tr -d ..
manatwork
1
@Manatwork Hebat, itu bekerja. Anda dapat mempostingnya sebagai jawaban. Terima kasih
prayagupd
1
Banyak jawaban bagus. Tetapi jika saya dapat menebak-nebak sasarannya, diperingatkan tentang 2.11.3 dan 2.1.13 ... ;-) Pertimbangkan untuk menambahkan angka nol pada nomor.
Rmano
1
@Rmano Maksudmu seperti VERSION='2.30.3100'? Tidak masalah apa saja .yang dihapus dengan semua jawaban di sini.
prayagupd
2
@PrayagUpd --- Saya hanya bermaksud bahwa jika Anda akan menggunakan nomor setelah konversi untuk perbandingan (dengan mengatakan jika "apakah ini versi yang lebih baru atau sama"), Anda harus menangani kasus seperti 2.11.3 dan 2.1.13 - - mereka tampak sama setelah penghapusan titik, tetapi jelas 2.11.3 lebih baru. Juga, 2.11.3 lebih baru dari 2.1.14, tetapi membandingkan 2113 dan 2114 akan mengarah pada jawaban yang salah. Saya ingat bug di suatu tempat untuk ini ...
Rmano

Jawaban:

136

Tidak perlu menjalankan program eksternal. bash's manipulasi string bisa mengatasinya (juga tersedia dalam ksh(dari mana asalnya) dan zsh):

$ VERSION='2.3.3'
$ echo "${VERSION//.}"
233

(Dalam manual kerang tersebut, Anda dapat menemukannya di bagian ekspansi parameter.)

manatwork
sumber
19
Untuk perincian lebih lanjut, sintaks dari jawaban di atas adalah ${string//substring/replacement}, di mana tampaknya tidak adanya garis miring terakhir dan string pengganti ditafsirkan sebagai delete . Lihat di sini .
sherrellbc
5
Benar, man bashkata itu dengan jelas di bagian Ekspansi Parameter Parameter : " ${parameter/pattern/string}(...) Jika string adalah nol, kecocokan pola dihapus dan pola/ berikut dapat dihilangkan."
manatwork
1
Masalah saya adalah bahwa nomor versi datang seperti ini "1.0.0"dan saya hanya menginginkan nomornya jadi ikuti apa yang @manatwork sarankan agar saya ubah: "${VERSIONNUM//'"'}"namun saya memasukkannya ' ' karena jika tidak, ia tidak akan mengenali ""string yang seperti itu untuk lepas landas.
Alexiscanny
1
@Alexiscanny, maksud Anda literal "hadir dalam nilai? Saya khawatir ini dianggap sebagai pertanyaan baru, tetapi cobalah untuk menghindari doublequote: "${VERSIONNUM//\"}" pastebin.com/3ECDtkwH
manatwork
1
Hebat!! bekerja -ashjuga!
Fr0zenFyr
88

Dengan urutan kronologis:

tr / sed

echo "$VERSION" | tr -d .
echo "$VERSION" | sed 's/\.//g'

csh / tcsh

echo $VERSION:as/.//

Kerang POSIX:

set -f
IFS=.
set -- $VERSION
IFS=
echo "$*"

ksh / zsh / bash / yash (dan busybox ashsaat dibuat dengan ASH_BASH_COMPAT)

echo "${VERSION//.}"

zsh

echo $VERSION:gs/./
Stéphane Chazelas
sumber
1
tr -d bahkan menghapus char tunggal dari set. Untuk Ex saya ingin menghapus DCC_ dari "DCC_VersionD", Ini menghapus DCC dan D. Output yang diharapkan: VersionD. Output Aktual: Versi. sed bekerja seperti pesona. :) terima kasih untuk postingnya.
kayle
20

Selain jawaban yang sukses sudah ada. Hal yang sama dapat dicapai dengan tr, dengan --deleteopsi.

echo "2.3.3" | tr --delete .

Yang akan menghasilkan: 233

daz
sumber
6
pada macos --deletebendera tidak dikenali, tetapi Anda dapat menggunakannya -dsebagai gantinya
Anentropic
6

Anda harus mencoba dengan sedsebaliknya

sed 's/\.//g'

fduff
sumber
4
echo "$VERSION" | tr -cd [:digit:]

Itu hanya akan mengembalikan digit, tidak peduli karakter apa yang ada

pengguna2796674
sumber
4

Perl

$ VERSION='2.3.3'                                     
$ perl -pe 's/\.//g' <<< "$VERSION"           
233

Python

$ VERSION='2.3.3'                                     
$ python -c 'import sys;print sys.argv[1].replace(".","")' "$VERSION"
233

Jika $VERSIONhanya berisi angka dan titik, kita dapat melakukan sesuatu yang lebih pendek:

$ python -c 'print "'$VERSION'".replace(".","")'
233

(Waspadalah itu adalah kerentanan kode injeksi meskipun jika $VERSIONmungkin mengandung karakter apa pun).

AWK

$ VERSION='2.3.3'
$ awk 'BEGIN{gsub(/\./,"",ARGV[1]);print ARGV[1]}' "$VERSION"
233

Atau ini:

$ awk '{gsub(/\./,"")}1' <<< "$VERSION"
233
Sergiy Kolodyazhnyy
sumber