Bandingkan string dengan pengkodean yang berbeda

Sep 25 2020

Saya mencoba membandingkan string dari file yang dikodekan dalam UTF8

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

dengan nomor seri yang di-hardcode ke dalam skrip. Saat mencetak ke konsol, string tersebut muncul dengan baik tetapi tampaknya ada masalah dengan format file (iconv tidak tersedia). Skrip adalah teks ASCII yang dapat dieksekusi jika keluaran file benar.

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

Keluaran:

.script.sh
EEPROM_ID: C000139-102
WRONG

Ada ide bagaimana membandingkan string tersebut dengan benar?

Jawaban

AdminBee Sep 25 2020 at 14:52

Ini harus memungkinkan untuk melakukan ini sepenuhnya di awk:

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

Untuk membaca ID menjadi variabel shell, seperti pada contoh skrip Anda:

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

Jika, seperti yang dicurigai @ user414777, Anda berurusan dengan file berenkode UTF-16, Anda mungkin harus menggunakan

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

atau coba

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

Sekali lagi, untuk membaca ID menjadi variabel shell:

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

atau

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