Linux

轉換 #!/bin/sh 中的字元串

  • August 23, 2019

嗨,我有這樣的輸出

[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.

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