ฉันได้อ่านคำถามเกี่ยวกับการจัดการสตริงทุบตี bash อื่น ๆ แต่ดูเหมือนจะเป็นแอปพลิเคชันพิเศษ
เป็นหลักมีวิธีการทำด้านล่างง่ายขึ้น?
แทน
$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD
สิ่งที่ต้องการ
$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD
แก้ไขฉันสนใจที่จะอยู่ในการควบคุมของ bash หากเป็นไปได้เพื่อรักษาความเร็ว (ตรงข้ามกับ sed / awk ซึ่งมีแนวโน้มที่จะทำให้สคริปต์ของฉันช้าลงอย่างมาก)
แก้ไข 2: @jimmij
ฉันชอบตัวอย่างที่สองและทำให้ฉันทำฟังก์ชั่น
bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; }
echo hello world | bash_m
HELLO_WORLD
tr
ตนเองจากนั้นตรงข้ามเป็นจริงเพราะเวลาของการวางไข่กระบวนการจะน้อยมากเมื่อเทียบกับเวลาของการจัดการสตริงที่sed
และawk
ทุ่มเท ถ้าสายยาวมากพูดคู่มือทุบตีทั้งหมดแล้วทุบตีก็สามารถปฏิเสธที่จะดำเนินการต่อไปทั้งหมดเพราะข้อ จำกัด ภายในบางอย่าง
sed
, awk
, tr
หรือคล้ายกัน ดูคำตอบ gena2x ซึ่งฉันได้แก้ไขเมื่อไม่นานมานี้เพิ่มข้อมูลตรงนี้: unix.stackexchange.com/questions/162221/คุณอาจต้องการเปรียบเทียบกับคำตอบ terdon กับคำถามเดียวกันที่เขาให้เวลากับสตริงสั้น ๆ การวางไข่กระบวนการกรณีใช้เวลามากที่สุด คุณสามารถทดสอบด้วยตัวเองและโพสต์ผลการ
read x; echo $x
กว่าประสิทธิภาพมากกว่า? ไวยากรณ์ไม่ได้ดูสั้นลงหรือสะอาดขึ้น เป็นวิธีที่รัดกุมมากขึ้นเพื่อทำสิ่งเดียวกันเป็นx=${x// /_}; x=${x^^}
{read x; echo ${x...
@jimmij ได้ชี้ให้เห็นว่าtr
/ sed
จะเร็วกว่าbash
นั้นการนับจำนวนจะเท่ากัน การใช้ไพพ์จะส่งผลให้เกิดกระบวนการพิเศษเสมอดังนั้นอาร์กิวเมนต์ของการบันทึกฟอร์กไม่ได้ใช้อีกต่อไป ดังนั้นหากใช้งานท่อให้ใช้sed
/ tr
etc หากคุณสามารถทำได้โดยใช้ทุบตีให้ทำเช่นนั้นและข้ามread x; echo $x
เรื่องไร้สาระนี้