Vergleichen Sie Zeichenfolgen mit verschiedenen Codierungen

Sep 25 2020

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 gut angezeigt, es scheint jedoch 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 Saiten richtig vergleicht?

Antworten

AdminBee Sep 25 2020 at 14:52

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

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

So lesen Sie die ID wie in Ihrem Beispielskript in eine Shell-Variable aus:

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

Wenn Sie, wie @ user414777 vermutet, mit UTF-16-codierten Dateien arbeiten, müssen Sie diese möglicherweise verwenden

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

So lesen Sie die ID erneut in eine Shell-Variable:

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)