구분 기호 없이 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_LISTprintf %s "$MY_LIST"또는 이어야 합니다 print -r -- "$MY_LIST". 따옴표가 없으면 쉘이 글로빙 문자를 확장하도록 지시합니다 \\*?[. 또한 다음 문제를 제외하면 여기서는 중요하지 않지만 공백에서 단어를 분할하도록 쉘에 지시합니다.
  • 추가로 사용하면 일부 상황에서는 echo백슬래시와 선행이 해석됩니다 .-
  • `sed s"/,/ /g"는 쉼표와 공백을 모두 단어 구분 기호로 만듭니다.

최종 테스트가 작동하지 않는 이유를 설명하는 추가 문제 는 wc -w. 에서 단어 분할을 수행하므로 숫자만 인쇄됩니다. 차이점을 확인해보세요 . 이 구문은 단어 분할을 금지하고 문자열 비교 연산자이므로 와 동일하지 않다는 것을 올바르게 알 수 있습니다 . 또는 사실이었을 것입니다(그러나 둘 다 실제 솔루션은 아니며 단지 제한된 해결 방법일 뿐입니다).$NUM_IN_LISTprint $NUM_IN_LIST$NUM_IN_LISTprint "$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 ,).

관련 정보