문자 비교

문자 비교

두 개의 변수에 저장된 두 개의 행이 있습니다. 하지만 어디에 저장되어 있는지는 중요하지 않습니다. 내 질문은 두 줄의 각 문자를 어떻게 비교합니까?

몇 가지 예를 들어보세요

안녕하세요

안녕하세요

결과: 참(H), 거짓..., 참(o)

답변1

당신이 찾고 있는 것은 다음과 같습니다:

l1=Hello
l2=Hlleo
count=`echo $l1|wc -m`

for cursor in `seq 1 $count`
do
    c1=`echo $l1|cut -c$cursor`
    c2=`echo $l2|cut -c$cursor`

    if test "$c1" = "$c2"
    then
        echo "true ($c1), "
    else
        echo "false ($c2 instead of $c1), "
    fi
done

답변2

둘 다 동일한 문자 길이를 갖는 경우:

string_1="hello"
string_2="hilda"

for (( i=0; i<${#string_1}; i++ )); do 
    [ "${string_1:$i:1}" == "${string_2:$i:1}" ] && echo "true" || echo "false"
done

답변3

sh에서 이 작업을 수행하는 것이 가능하지만 큰 문자열에는 그리 효율적이지 않습니다.

compare_characters () {
  tail1="$1" tail2="$2"
  if [ "${#tail1}" -ne "${#tail2}" ]; then
    echo >&2 "The strings have different length"
    return 1
  fi
  while [ -n "$tail1" ]; do
    h1="${tail1%"${tail1#?}"}" h2="${tail2%"${tail2#?}"}"
    if [ "$h1" = "$h2" ]; then
      echo true "$h1"
    else
      echo false "$h1" "$h2"
    fi
    tail1="${tail1#?}" tail2="${tail2#?}"
  done
}

또는 다른 출력 형식이 마음에 들지 않으면 다음을 사용할 수 있습니다.cmp -l. 프로세스 대체(ksh, bash 또는 zsh)가 있는 셸에서:

cmp <(printf %s "$string1") <(printf %s "$string2")

/dev/fd프로세스 교체 없이 해결 방법을 사용하여 명명된 파이프, 임시 파일에 쓰기 또는 플랫폼에서 지원하는 경우 두 문자열을 명령에 전달해야 합니다 .

printf %s "$string1" | {
  exec 3<&0
  printf %s "$string2" | cmp /dev/fd/3 /dev/fd/0
}

답변4

var1="string1"
var2="string2"
i=1
l=${#var1}
while [ ${i} -le ${l} ]
do
  c1=$(echo ${var1}|cut -c ${i})
  c2=$(echo ${var2}|cut -c ${i})
  if [ ${c1} == ${c2} ]
  then
     printf "True (${c1}) "
  else
     printf "False "
  fi
  (( i++ ))
done

두 변수의 문자열 길이가 동일하지 않으면 결과가 모호합니다. 스크립트에서는 두 변수의 문자열 길이가 동일하다고 가정합니다.

관련 정보