Compare strings com codificações diferentes
Sep 25 2020
Estou tentando comparar uma string de um arquivo codificado em UTF8
file /dev/eeprom: UTF-8 Unicode text, with very long lines
com um número de série codificado no script. Ao imprimir para o console, a string aparece bem, mas parece que há um problema com o formato do arquivo (embora o iconv não esteja disponível). O script é um executável de texto ASCII se a saída do arquivo estiver correta.
#!/bin/sh
eeprom_id=$(cat /dev/eeprom | grep -e ID: | awk '{split($0,a,":"); print a[2]}')
echo "EEPROM_ID: $eeprom_id" if [ $eeprom_id == "C000139-102" ]
then
echo "String identical"
else
echo "WRONG"
fi
Resultado:
.script.sh
EEPROM_ID: C000139-102
WRONG
Alguma ideia de como comparar essas cordas corretamente?
Respostas
AdminBee Sep 25 2020 at 14:52
Deve ser possível fazer isso inteiramente em awk:
awk -F':' -v ref_id="C000139-102" '$1=="ID" {if ($2==ref_id) print "Identical"; else print "WRONG"}' /dev/eeprom
Para ler o ID em uma variável shell, como em seu script de exemplo:
eeprom_id=$(awk -F':' '$1=="ID" {print $2}')
Se, como @ user414777 suspeita, você está lidando com um arquivo codificado em UTF-16, pode ser necessário usar
cat /dev/eeprom | tr -d '\0' | awk -F':' -v ref_id="C000139-102" '$1=="ID" {if ($2==ref_id) print "Identical"; else print "WRONG"}'
ou tente
awk -F':' -v ref_id="C000139-102" '{gsub(/\x00/,""); if ($1=="ID") {if ($2==ref_id) print "Identical"; else print "WRONG"}}' /dev/eeprom
Novamente, para ler o ID em uma variável de shell:
eeprom_id=$(cat /dev/eeprom | tr -d '\0' | awk -F':' '$1=="ID" {print $2}')
ou
eeprom_id=$(awk -F':' '{gsub(/\x00/,""); if ($1=="ID") print $2}' /dev/eeprom)
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
George Harrison ficou chateado por suas letras de 'Hurdy Gurdy Man' de Donovan não terem sido usadas