Bash เพิ่มช่องว่างต่อท้ายเพื่อจัดเรียงสตริง


20

รหัสปัจจุบันของฉันมีลักษณะดังนี้: x=${y:0:40}ซึ่งจำกัดความยาวของสตริงไว้ที่ 40 ตัวอักษร ในกรณีที่สตริงมีความยาวน้อยกว่า 40 ตัวอักษรเป็นไปได้หรือไม่ที่จะเติมช่องว่างท้ายท้ายด้วยช่องว่าง?

ดังนั้นหากฉัน y="very short text"

ฉันอยากให้ y เป็น:

y = "ข้อความสั้นมาก(+25 ช่องว่างต่อท้าย) "

คำตอบ:


20

หากอักขระเหล่านั้นเป็นไบต์เดียวทั้งหมดนั่นคือถ้าคุณอยู่ในสถานที่ที่ชุดอักขระเป็นไบต์เดียว (เช่น iso8859-1) หรือถ้าชุดอักขระของสถานที่ตั้งเป็น UTF-8 แต่ข้อความเป็น ASCII เท่านั้นคุณสามารถทำได้ :

printf -v y %-40.40s "$y"

ที่จะครอบคลุมทั้งการตัดและการขยาย

ถ้าไม่คุณสามารถเพิ่ม 40 ช่องว่างและใช้${y:0:40}วิธีการของคุณ

printf -v pad %40s
y=$y$pad
y=${y:0:40}

zsh มีผู้ประกอบการเฉพาะด้านซ้ายและขวา:

y=${(r:40:)y}

(ยังตัดทอน) zsh's printfนับตัวอักษรแทนของไบต์ดังนั้นจะไม่ได้bashของปัญหาดังกล่าว อย่างไรก็ตามโปรดทราบว่าคุณต้องใช้zsh5.3 หรือใหม่กว่าสำหรับ-vตัวเลือก

ดูคำตอบนี้สำหรับคำถามที่เกี่ยวข้องเพื่อดูรายละเอียดเพิ่มเติมหากคุณเผชิญกับตัวละครที่ไม่ได้มีความกว้างเท่ากัน


14

คุณควรลองprintf:

printf '%-40s' "$y"

10

บริสุทธิ์bash:

ten="          " 
forty="$ten$ten$ten$ten" 
y="very short text"
y="${y:0:40}${forty:0:$((40 - ${#y}))}"
echo "'${y}'"

วิธีการคือการเพิ่มช่องว่าง 0-40 ให้กับทุกสายหลังจากตัดทอนมัน

เอาท์พุท (บันทึกตำแหน่งคำพูดเดียว):

'very short text                         '

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