Comparar personagens

3

Eu tenho duas linhas, que são salvas em duas variáveis. Mas isso não importa realmente, onde eles são salvos. Minha pergunta é: como eu comparo cada personagem das duas linhas?

Para exemplos

Olá

Hlleo

resultado: verdadeiro (H), falso ..., verdadeiro (o)

    
por Mafi 27.04.2016 / 22:34

4 respostas

4

O que se segue é provavelmente o que procura:

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
    
por 27.04.2016 / 22:51
2

Caso ambos tenham o mesmo tamanho de caractere:

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
    
por 27.04.2016 / 22:54
2

É possível fazer isso de maneira sh, mas não é muito eficiente para grandes strings.

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
}

Como alternativa, se você não se importar com um formato de saída diferente, use cmp -l . Em um shell que possui substituição de processo (ksh, bash ou zsh):

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

Sem a substituição do processo, você precisa usar uma solução alternativa para passar duas sequências para o comando: um canal nomeado, ou gravar em um arquivo temporário ou usar /dev/fd se sua plataforma for compatível.

printf %s "$string1" | {
  exec 3<&0
  printf %s "$string2" | cmp /dev/fd/3 /dev/fd/0
}
    
por 28.04.2016 / 19:03
0
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

Se o tamanho da string das duas variáveis não for o mesmo, o resultado será ambíguo. Este script assume que ambas as variáveis estão no mesmo tamanho de string.

    
por 27.04.2016 / 22:54

Tags