Bash
比較不同編碼的字元串
我正在嘗試比較以 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)