比较字符

比较字符

我有两行,保存在两个变量中。但他们被拯救在哪里并不重要。我的问题是,如何比较两行中的每个字符?

举些例子

你好

赫勒奥

结果:真(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)的 shell 中:

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

如果两个变量的字符串长度不相同,则结果是不明确的。该脚本假设两个变量的字符串长度相同。

相关内容