Bash 4.3 Độ dài âm của chuỗi con trên OS X


12

Bash 4.2 đã thêm hỗ trợ cho độ dài chuỗi con âm:

http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01

Ví dụ 37-12. Tham số âm trong cấu trúc trích xuất chuỗi

Khi tham số "độ dài" âm, nó sẽ đóng vai trò là tham số bù từ đầu cuối.

Ví dụ: các đầu ra sau "Thế giới" khi được thử nghiệm trên Ubuntu:

STR="Hello World!"
echo ${STR:6:-1}

Nhưng trong OS X (GNU bash, phiên bản 4.3.42 (1) -release (x86_64-apple-darwin14.5.0)), việc sử dụng đó tạo ra lỗi sau:

-1: substring expression < 0

Đây có phải là OS X cụ thể không, hay nó đã bị vô hiệu hóa một lần nữa trong các bản cập nhật bash sau này? Có cách nào để kích hoạt chức năng này cho OS X không?


1
tldp.org/LDP/abs/html/abs-guide.html#BASH2 - những gì đã được thêm vào khi, bắt đầu với v2, v3 và v4 sau.
Hannu

@Hannu có, tài liệu đó nói rằng ngữ nghĩa độ dài âm đã được thêm vào trong phiên bản 4.2
Brent Faust

Tôi có cùng một vấn đề: bạn đã tìm ra cách để đối phó với điều đó chưa?
Romain Jouin

@romainjouin Chỉ bằng cách thay đổi thuật toán. Cú pháp này không hoạt động theo OX X, ngay cả phiên bản Bash 4.3.46! Bỏ phiếu cho câu hỏi để cố gắng thu hút nhiều hơn về vấn đề này. Ai đó biết câu trả lời ...
Brent Faust

1
@Rubistro Chỉ cần nhấn này: | Một cách xung quanh là (trong ví dụ của bạn)echo "Hello World" | rev | cut -c -5 | rev
donovanmuller

Câu trả lời:


7

Mặc dù giải pháp của flabdablet chỉ hoạt động đối với các chuỗi có độ dài cố định, bạn có thể sử dụng giải pháp này để thay thế cho các chuỗi có kích thước động:

echo ${STR:6:$((${#STR} - 6 - 1))}

Chi tiết:

  • ${#STR} trả về độ dài của chuỗi.
  • $((a - b - c)) trừ toán học
  • ${STR:start:len} trả về một chuỗi con.

Vì vậy, kết hợp đối số thứ hai với biểu thức chuỗi con là độ dài của chuỗi trừ đi phần bù bắt đầu trừ đi giá trị bạn sẽ chỉ định làm giá trị âm trong cú pháp bash mới hơn.


2

$ {STR: 6: $ {# STR} -7} phải là một thay thế thả xuống hoạt động cho $ {STR: 6: -1} nếu STR được đảm bảo có ít nhất 7 ký tự. Nếu nó có thể ngắn hơn, điều này cũng sẽ khiến bash OS X phàn nàn về độ dài tiêu cực hoặc sai lầm khủng khiếp trên các phiên bản bash hỗ trợ độ dài âm được lấy từ độ lệch phải.


Thx, đã lừa tôi
Jean-Bernard Jansen

0

Googled từ đây :

Họ nói ${STR:6:$#-1}nên làm việc tốt

Trong trường hợp của tôi, với một lỗi tương tự ${VERSION::-2}, nó chỉ bắt đầu hoạt động sau khi thêm 0 như thế này : ${VERSION:0:-2}.

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.