Comparar cadenas con diferentes codificaciones

Sep 25 2020

Estoy tratando de comparar una cadena de un archivo que está codificado en UTF8

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

con un número de serie que está codificado en el script. Al imprimir en la consola, la cadena parece estar bien, pero parece que hay un problema con el formato del archivo (aunque iconv no está disponible). El script es un ejecutable de texto ASCII si la salida del archivo es correcta.

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

Salida:

.script.sh
EEPROM_ID: C000139-102
WRONG

¿Alguna idea de cómo comparar esas cadenas correctamente?

Respuestas

AdminBee Sep 25 2020 at 14:52

Debería ser posible hacer esto completamente en awk:

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

Para leer el ID en una variable de shell, como en su script de ejemplo:

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

Si, como sospecha @ user414777, está tratando con un archivo codificado en UTF-16, es posible que deba 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"}'

o tratar

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

Nuevamente, para leer el ID en una variable de shell:

eeprom_id=$(cat /dev/eeprom | tr -d '\0' | awk -F':' '$1=="ID" {print $2}')

o

eeprom_id=$(awk -F':' '{gsub(/\x00/,""); if ($1=="ID") print $2}' /dev/eeprom)