统计 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_LISTprint $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 ,)

相关内容