Como fazer uma comparação de string ignora o espaço em branco?

1

Como você compararia duas strings, mas ignoraria espaços em branco? Eu estou fazendo o seguinte:

if [ "$a" == "$b" ]; then
   echo ok
fi

Mas não parece corresponder. Eu imprimi o que "a" e "b" são e eles são os mesmos. Parece que eles estão usando diferentes caracteres de nova linha.

    
por gyro131313 24.01.2017 / 02:38

2 respostas

3

Tecnicamente, para ignorar todos os espaços em branco, você pode passar as duas strings por tr :

[ "$(echo "$a" | tr -d '[:space:]')" = "$(echo "$b" | tr -d '[:space:]')" ]

No entanto, dessa forma, todos os espaços em branco são removidos antes da comparação, portanto, por exemplo, "a b" e "ab" serão testados como iguais. Não tenho certeza se isso é desejável. Você pode ajustar o filtro tr para fazer o que você precisa. Por exemplo, para remover apenas novas linhas de todos os tipos, você pode fazer tr -d '\n\r' .

    
por 24.01.2017 / 05:02
0

No bash, você pode usar uma expansão de parâmetro sintaxe para obter o valor de uma variável com alguns caracteres removidos (ou mais geralmente substituindo ocorrências de um padrão).

if [[ "${a//[$' \t\n\r']/}" == "${b//[$' \t\n\r']/}" ]]; then
  echo ok
fi

Se o problema é que eles estão "usando diferentes caracteres de nova linha", isso provavelmente significa que um deles é proveniente de um arquivo do Windows. As linhas do Windows têm um CR extra (retorno de carro, $'\r na sintaxe bash) antes do caractere de nova linha ( $'\n' ). Se você tiver strings multilinhas, você pode retirar apenas os caracteres CR:

if [[ "${a//$'\r'/}" == "${b//$'\r'/}" ]]; then
  echo ok
fi

Se as variáveis forem strings de linha única, o CR problemático estará no final e você poderá usar a sintaxe de remoção de sufixos:

if [[ "${a%$'\r'}" == "${b%$'\r'}" ]]; then
  echo ok
fi

Se você precisar deste em sh simples, a dificuldade (menor) está inserindo um caractere CR.

cr=$(printf '\r')
if [[ "${a%$cr}" == "${b%$cr}" ]]; then
  echo ok
fi
    
por 25.01.2017 / 02:48

Tags