区切り文字なしでリスト内の単語を数える

区切り文字なしでリスト内の単語を数える

次のような簡単な 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_LISTprintf %s "$MY_LIST"または である必要がありますprint -r -- "$MY_LIST"。引用符がないと、シェルはグロブ文字を展開します\\*?[。また、シェルはスペースで単語を分割しますが、次の問題を除いて、ここでは問題になりません。
  • 追加で使用した場合、状況によっては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 ,)

関連情報