นับคำใน LIST โดยไม่มีตัวคั่น


1

ฉันมีรหัส ksh ง่าย ๆ ต่อไปนี้:

 MY_LIST=first,second,third
 NUM_IN_LIST=` echo $MY_LIST | sed s"/,/ /g" | wc -w `
 print $NUM_IN_LIST
 3
 [[ $NUM_IN_LIST = 3 ]] && print match

 but I dont get the match print -:(

อาจเป็นเพราะช่องว่างบางอย่าง?

ฉันจะขอคำแนะนำอื่น ๆ เพื่อนับและพิมพ์คำเป็น $ MY_LIST ได้หรือไม่ (หลังจากลบตัวคั่น ",")

คำตอบ:


0

ตัวอย่างของคุณใช้ได้กับฉัน

นี่คือทางเลือก:

MY_LIST=first,second,third
saveIFS=$IFS
IFS=','
array=($MY_LIST)
IFS=$saveIFS
NUM_IN_LIST=${#array[@]}
print $NUM_IN_LIST
[[ $NUM_IN_LIST = 3 ]] && print match

อีกตัวอย่างหนึ่งคือการใช้ awk '{print NF}' เพื่อนับองค์ประกอบใน MY_LIST
jennifer

คุณต้องการset -fก่อน unquote $MY_LISTในกรณีที่สตริงมีอักขระกลม แต่การใช้IFSมีความซับซ้อนมากขึ้นซึ่งจำเป็นต้องมีหน่วยเป็น ksh
Gilles

1

รหัสของคุณควรใช้งานได้ แต่ถ้า$MY_LISTไม่มีอักขระพิเศษต่าง ๆ :

  • echo $MY_LISTควรจะเป็นหรือprintf %s "$MY_LIST" print -r -- "$MY_LIST"การไม่มีเครื่องหมายอัญประกาศบอกให้เชลล์แสดงตัวอักษรกลมที่มี\\*?[อยู่ นอกจากนี้ยังบอกให้เชลล์แยกคำที่ช่องว่างแม้ว่าจะไม่สำคัญที่นี่ยกเว้นสำหรับปัญหาถัดไป
  • การใช้echoสาเหตุการตีความเพิ่มเติมของแบ็กสแลชและการเป็นผู้นำ-ในบางสถานการณ์
  • `sed s" /, / / ​​g "ทำให้ทั้งเครื่องหมายจุลภาคและเว้นวรรคคั่นคำ

ปัญหาเพิ่มเติมอธิบายว่าทำไมการทดสอบขั้นสุดท้ายของคุณไม่ทำงานนั่นคือการwc -wสร้างเอาต์พุตด้วยช่องว่างนำซึ่งถูกบันทึก$NUM_IN_LISTไว้ print $NUM_IN_LISTทำการแยกคำออก$NUM_IN_LISTดังนั้นมันจะจบลงด้วยการพิมพ์ตัวเลข ทำprint "$NUM_IN_LIST"เพื่อดูความแตกต่าง [[ … ]]สร้างยับยั้งการแยกคำและ=เป็นผู้ประกอบการเปรียบเทียบสตริงดังนั้นคุณจะบอกได้อย่างถูกต้องที่ไม่ได้เป็นสิ่งเดียวกับ' 3' หรือจะเป็นจริง (แต่ไม่ใช่วิธีการแก้ปัญหาจริงพวกเขาเป็นเพียงการแก้ปัญหาที่ จำกัด )'3'[[ $NUM_IN_LIST -eq 3 ]][ $NUM_IN_LIST = 3 ]


วิธี ksh ล้วนเพื่อแสดงจำนวนของเขตข้อมูลที่คั่นด้วยเครื่องหมายจุลภาคคือ

commas=${MY_LIST//[!,]/}
NUM_IN_LIST=${#commas}

หากใครต้องการโซลูชั่นที่ POSIX commas=$(printf %s "$MY_LIST" | tr -dc ,)ดวลจุดโทษแทนบรรทัดแรกโดย

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