Vergleichen Sie Zeichenfolgen mit unterschiedlichen Kodierungen

Vergleichen Sie Zeichenfolgen mit unterschiedlichen Kodierungen

Ich versuche, eine Zeichenfolge aus einer Datei zu vergleichen, die in UTF8 codiert ist

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

mit einer Seriennummer, die im Skript fest codiert ist. Beim Drucken auf der Konsole wird die Zeichenfolge einwandfrei angezeigt, aber es scheint ein Problem mit dem Format der Datei zu geben (iconv ist jedoch nicht verfügbar). Das Skript ist eine ausführbare ASCII-Textdatei, wenn die Dateiausgabe korrekt ist.

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

Ausgabe:

.script.sh
EEPROM_ID: C000139-102
WRONG

Irgendwelche Ideen, wie man diese Zeichenfolgen richtig vergleicht?

Antwort1

Dies sollte vollständig in folgendem Format möglich sein awk:

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

Um die ID in eine Shell-Variable auszulesen, wie in Ihrem Beispielskript:

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

Wenn Sie, wie @user414777 vermutet, mit einer UTF-16-kodierten Datei arbeiten, müssen Sie möglicherweise

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

oder Versuche

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

Um die ID erneut in eine Shell-Variable einzulesen:

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

oder

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

verwandte Informationen