Сравнение строк с разными кодировками

Сравнение строк с разными кодировками

Я пытаюсь сравнить строку из файла, который закодирован в UTF8

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

с серийным номером, который жестко закодирован в скрипте. При печати на консоль строка отображается нормально, но, похоже, есть проблема с форматом файла (iconv недоступен). Скрипт представляет собой исполняемый текст ASCII, если вывод файла корректен.

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

Выход:

.script.sh
EEPROM_ID: C000139-102
WRONG

Есть идеи, как правильно сравнить эти строки?

решение1

Это должно быть возможно сделать полностью за awk:

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

Чтобы считать идентификатор в переменную оболочки, как в вашем примере скрипта:

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

Если, как подозревает @user414777, вы имеете дело с файлом в кодировке UTF-16, вам, возможно, придется использовать

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

или попробуйте

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

И снова, чтобы прочитать идентификатор в переменную оболочки:

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

или

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

Связанный контент