Vergleichen Sie Zeichenfolgen mit verschiedenen Codierungen
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
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)