Linux
轉換 #!/bin/sh 中的字元串
嗨,我有這樣的輸出
[4251][7c3c]
我需要得到
517C3C
我試過了
decodeSerial() { serial=$1 #serial=$serial | sed -r 's/(\[|\])//g' #serial=$serial | sed 's/]//' #serial=$serial | tr a-z A-Z serial=${serial: -6} echo $serial }
只有最後六個字元可以正常工作
$ echo '[4251][7c3c]' | tr -d '[]' | tr '[:lower:]' '[:upper:]' | cut -c 3- 517C3C
作為一個函式:
decodeSerial () { printf '%s\n' "$1" | tr -d '[]' | tr '[:lower:]' '[:upper:]' | cut -c 3- }
管道從輸入中刪除所有
[
和]
字元,將任何小寫字元轉換為大寫,並從結果中丟棄前兩個字元。通過一次
sed
呼叫(假設字母字元是十六進制數字,a
直到f
):$ echo '[4251][7c3c]' | sed 's/[][]//g; y/abcdef/ABCDEF/; s/^..//' 517C3C
要保留最後六個字元而不是刪除前兩個字元,
sed
可以將此呼叫更改為sed 's/[][]//g; y/abcdef/ABCDEF/; s/^.*\(.\{6\}\)$/\1/'
使用
awk
:$ echo '[4251][7c3c]' | awk '{ gsub("[][]", ""); print toupper(substr($1,3)) }' 517C3C
awk
在你的函式中使用命令(sed
上面的命令可以以類似的方式插入):decodeSerial () { printf '%s\n' "$1" | awk '{ gsub("[][]", ""); print toupper(substr($1,3)) }' }
在 shell 函式中不使用
awk
管道:decodeSerial () { awk -v string="$1" 'BEGIN { gsub("[][]", "", string); print toupper(substr(string,3)) }' }
請注意,您的
${serial: -6}
isbash
語法可能不適用於/bin/sh
.