計算 LIST 中不帶分隔符號的單字數

計算 LIST 中不帶分隔符號的單字數

我有以下簡單的 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 中的單字嗎? (刪除“,”分隔符號後)

答案1

你的例子對我有用。

這是一個替代方案:

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

答案2

您的程式碼應該可以工作,但前提是$MY_LIST不包含任何各種特殊字元:

  • echo $MY_LIST應該是printf %s "$MY_LIST"print -r -- "$MY_LIST".缺少引號告訴 shell 擴展通配字元\\*?[。它還告訴 shell 在空格處分割單詞,儘管除了下一個問題之外,這裡並不重要。
  • 在某些情況下,使用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 sh 解決方案,請將第一行替換為commas=$(printf %s "$MY_LIST" | tr -dc ,).

相關內容