Bash

比較不同編碼的字元串

  • September 28, 2020

我正在嘗試比較以 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

任何想法如何正確比較這些字元串?

應該可以完全做到這一點awk

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

要將 ID 讀出到 shell 變數中,如您的範例腳本中所示:

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 讀入 shell 變數:

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)

引用自:https://unix.stackexchange.com/questions/611369