さまざまなエンコーディングの文字列比較

さまざまなエンコーディングの文字列比較

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

サンプルスクリプトに示すように、IDをシェル変数として読み取るには、次の手順を実行します。

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

IDをシェル変数として読み戻します。

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)

おすすめ記事