Bash 4.3 ความยาวเชิงลบของสตริงย่อยใน OS X


12

Bash 4.2 เพิ่มการสนับสนุนสำหรับความยาวสตริงย่อยเชิงลบ:

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

ตัวอย่างที่ 37-12 พารามิเตอร์เชิงลบในโครงสร้างการแยกสตริง

เมื่อพารามิเตอร์ "length" เป็นค่าลบจะทำหน้าที่เป็นพารามิเตอร์ offset-from-end

ตัวอย่างเช่นผลลัพธ์ต่อไปนี้ "World" เมื่อทดสอบกับ Ubuntu:

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

แต่ใน OS X (GNU bash เวอร์ชัน 4.3.42 (1) - ปล่อยออกมา (x86_64-apple-darwin14.5.0)) การใช้งานนั้นทำให้เกิดข้อผิดพลาดดังต่อไปนี้:

-1: substring expression < 0

นี่เป็น OS X เฉพาะหรือไม่หรือถูกปิดใช้งานอีกครั้งในการปรับปรุงทุบตีในภายหลัง มีวิธีการเปิดใช้งานฟังก์ชั่นนี้สำหรับ OS X หรือไม่?


1
tldp.org/LDP/abs/html/abs-guide.html#BASH2 - สิ่งที่เพิ่มเมื่อเริ่มต้นด้วย v2, v3 และ v4 ดังนี้
Hannu

@Hannu ใช่เอกสารที่บอกว่าความหมายเชิงลบความยาวที่เพิ่มขึ้นในรุ่น 4.2
Brent เฟาสต์

ฉันมีปัญหาเดียวกัน: คุณหาวิธีจัดการกับสิ่งนั้นหรือไม่?
Romain Jouin

@romainjouin เพียงแค่เปลี่ยนอัลกอริทึม ไวยากรณ์นี้ไม่ทำงานภายใต้ OX X แม้ใน Bash เวอร์ชัน 4.3.46! โหวตคำถามเพื่อพยายามจับตาดูสิ่งนี้มากขึ้น ใครบางคนรู้คำตอบ ...
Brent Faust

1
@Rubistro เพียงกดปุ่มนี้: | ทางเดียวคือ (ในตัวอย่างของคุณ)echo "Hello World" | rev | cut -c -5 | rev
donovanmuller

คำตอบ:


7

ในขณะที่โซลูชันของ flabdablet ใช้ได้กับสตริงที่มีความยาวคงที่เท่านั้นคุณสามารถใช้สิ่งนี้แทนการแทนที่สำหรับสตริงที่มีขนาดแบบไดนามิก:

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

ในรายละเอียด:

  • ${#STR} ส่งคืนความยาวของสตริง
  • $((a - b - c)) การลบทางคณิตศาสตร์
  • ${STR:start:len} ส่งกลับสตริงย่อย

ดังนั้นการรวมอาร์กิวเมนต์ที่สองเข้ากับนิพจน์สตริงย่อยคือความยาวของสตริงลบออฟเซ็ตเริ่มต้นลบด้วยค่าที่คุณจะระบุเป็นค่าลบในไวยากรณ์ bash ที่ใหม่กว่า


2

$ {STR: 6: $ {# STR} -7} ควรแทนที่ดรอปอินที่ใช้งานได้สำหรับ $ {STR: 6: -1} ถ้า STR รับประกันว่ามีอย่างน้อย 7 ตัวอักษร ถ้ามันสั้นลงสิ่งนี้จะทำให้ OS X bash บ่นเกี่ยวกับความยาวเชิงลบหรือผิดไปอย่างน่ากลัวในเวอร์ชั่นทุบตีที่สนับสนุนความยาวเชิงลบที่ถูกถ่ายจากออฟเซ็ตจากขวา


ขอบคุณทำเคล็ดลับสำหรับฉัน
Jean-Bernard Jansen

0

Googled จากที่นี่ :

พวกเขาบอกว่า${STR:6:$#-1}ควรทำงานได้ดี

ในกรณีของฉันกับข้อผิดพลาดที่คล้ายกัน${VERSION::-2}มันก็เริ่มที่จะทำงานหลังจากที่เพิ่ม 0 ${VERSION:0:-2}เช่นนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.