Comparar cadenas con diferentes codificaciones
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
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)