Confronta stringhe con codifiche diverse

Sep 25 2020

Sto cercando di confrontare una stringa da un file codificato in UTF8

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

con un numero di serie che è hardcoded nello script. Quando si stampa sulla console, la stringa appare a posto ma sembra che ci sia un problema con il formato del file (iconv non è disponibile però). Lo script è un eseguibile di testo ASCII se l'output del file è corretto.

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

Produzione:

.script.sh
EEPROM_ID: C000139-102
WRONG

Qualche idea su come confrontare correttamente quelle stringhe?

Risposte

AdminBee Sep 25 2020 at 14:52

Dovrebbe essere possibile farlo interamente in awk:

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

Per leggere l'ID in una variabile di shell, come nel tuo script di esempio:

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

Se, come sospetta @ user414777, hai a che fare con un file con codifica UTF-16, potresti dover utilizzare

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 prova

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

Ancora una volta, per leggere l'ID in una variabile di 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)