Comparer des chaînes avec différents encodages

Sep 25 2020

J'essaye de comparer une chaîne d'un fichier encodé en UTF8

file /dev/eeprom: UTF-8 Unicode text, with very long lines

avec un numéro de série codé en dur dans le script. Lors de l'impression sur la console, la chaîne apparaît très bien mais il semble y avoir un problème avec le format du fichier (iconv n'est pas disponible cependant). Le script est un exécutable de texte ASCII si la sortie du fichier est correcte.

#!/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

Production:

.script.sh
EEPROM_ID: C000139-102
WRONG

Des idées pour comparer correctement ces chaînes?

Réponses

AdminBee Sep 25 2020 at 14:52

Il devrait être possible de le faire entièrement dans awk:

awk -F':' -v ref_id="C000139-102" '$1=="ID" {if ($2==ref_id) print "Identical"; else print "WRONG"}' /dev/eeprom

Pour lire l'ID dans une variable shell, comme dans votre exemple de script:

eeprom_id=$(awk -F':' '$1=="ID" {print $2}')

Si, comme le suspecte @ user414777, vous avez affaire à un fichier encodé en UTF-16, vous devrez peut-être utiliser

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 essayez

awk -F':' -v ref_id="C000139-102" '{gsub(/\x00/,""); if ($1=="ID") {if ($2==ref_id) print "Identical"; else print "WRONG"}}' /dev/eeprom

Encore une fois, pour lire l'ID dans une variable 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)