xóa các ký tự cụ thể khỏi một biến bằng cách sử dụng bash


123

Tôi muốn phân tích một biến (trong trường hợp của tôi là phiên bản bộ công cụ phát triển) để làm cho nó chấm ( .) miễn phí. Nếu version='2.3.3', đầu ra mong muốn là 233.

Tôi đã cố gắng như dưới đây, nhưng nó đòi hỏi .phải được thay thế bằng một nhân vật khác cho tôi 2_3_3. Nó sẽ ổn nếu tr . ''có thể làm việc.

  1 VERSION='2.3.3' 
  2 echo "2.3.3" | tr . _

10
Không, nó không yêu cầu : echo "2.3.3" | tr -d ..
manatwork

1
@manatwork Tuyệt vời, hoạt động. Bạn có thể gửi nó như là câu trả lời. Cảm ơn
nguyện

1
Rất nhiều câu trả lời hay. Nhưng nếu tôi có thể đoán mục tiêu thứ hai, hãy cảnh báo về 2.11.3 và 2.1.13 ... ;-) Hãy xem xét việc thêm các số 0 vào số.
Rmano

1
@Rmano Ý bạn là gì VERSION='2.30.3100'? Không có vấn đề gì chỉ .là loại bỏ với tất cả các câu trả lời ở đây.
nguyện

2
@PrayagUpd --- Tôi chỉ đơn giản là nếu bạn sẽ sử dụng số sau khi chuyển đổi để so sánh (như để nói nếu "phiên bản này mới hơn hay giống nhau"), bạn nên quan tâm đến các trường hợp như 2.11.3 và 2.1.13 - - chúng có vẻ giống nhau sau khi xóa dấu chấm, nhưng rõ ràng 2.11.3 mới hơn. Ngoài ra, 2.11.3 mới hơn 2.1,14, nhưng so sánh 2113 và 2114 sẽ dẫn đến câu trả lời sai. Tôi nhớ một lỗi ở đâu đó cho điều này ...
Rmano

Câu trả lời:


136

Không cần phải thực hiện một chương trình bên ngoài. Thao tác chuỗibash của chuỗi có thể xử lý nó (cũng có sẵn trong ksh(nơi nó đến) và zsh):

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

(Trong hướng dẫn sử dụng của shell đó, bạn có thể tìm thấy phần này trong phần mở rộng tham số.)


19
Để biết thêm chi tiết, cú pháp của câu trả lời ở trên là ${string//substring/replacement}, trong đó rõ ràng việc thiếu dấu gạch chéo chuyển tiếp và chuỗi thay thế cuối cùng được hiểu là xóa . Xem tại đây .
sherrellbc

5
Đúng, man bashnói rõ ràng trong phần Mở rộng tham số Shell : ${parameter/pattern/string}/
Mạnh (Lỗi

1
Vấn đề của tôi là số phiên bản xuất hiện như thế này "1.0.0"và tôi chỉ muốn số đó vì vậy hãy làm theo những gì @manatwork đề nghị tôi đã thay đổi: "${VERSIONNUM//'"'}"tuy nhiên tôi chèn ngay cả ' ' vì nếu không nó sẽ không nhận ra ""chuỗi giống như vậy.
Alexiscanny

1
@Alexiscanny, ý bạn là nghĩa đen "có mặt trong giá trị? Tôi sợ câu hỏi này được coi là câu hỏi mới, nhưng hãy cố gắng thoát khỏi doublequote: "${VERSIONNUM//\"}" pastebin.com/3ECDtkwH
manatwork

1
Tuyệt vời!! hoạt động trên -ashquá!
Fr0zenFyr

88

Theo thứ tự thời gian:

tr / sed

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

csh / tcsh

echo $VERSION:as/.//

Vỏ POSIX:

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

ksh / zsh / bash / yash (và busybox ashkhi được xây dựng với ASH_BASH_COMPAT)

echo "${VERSION//.}"

zsh

echo $VERSION:gs/./

1
tr -d đã xóa ngay cả char duy nhất khỏi tập hợp. Đối với Ex tôi muốn xóa DCC_ khỏi "DCC_VersionD", nó sẽ xóa DCC và D. Dự kiến ​​đầu ra: VersionD. Đầu ra thực tế: Phiên bản. sed làm việc như một lá bùa. :) Cảm ơn vì bài đăng.
kayle

20

Ngoài các câu trả lời thành công đã tồn tại. Điều tương tự có thể đạt được với tr, với --deletetùy chọn.

echo "2.3.3" | tr --delete .

Sẽ xuất ra: 233


6
trên macos, --deletecờ không được nhận dạng, nhưng -dthay vào đó bạn có thể sử dụng
Anentropic

6

sedthay vào đó bạn nên thử

sed 's/\.//g'


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

Điều đó sẽ chỉ trả về các chữ số, bất kể các ký tự khác có mặt là gì


4

Perl

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

Con trăn

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

Nếu $VERSIONchỉ chứa chữ số và dấu chấm, chúng ta có thể làm một cái gì đó thậm chí ngắn hơn:

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

(hãy cẩn thận, đó là một lỗ hổng tiêm mã mặc dù nếu $VERSIONcó thể chứa bất kỳ ký tự nào).

AWK

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

Hoặc này:

$ awk '{gsub(/\./,"")}1' <<< "$VERSION"
233
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.