嗨,我有这样的输出
[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
}
只有最后六个字符可以正常工作
答案1
$ 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)) }'
}
awk
在 shell 函数中不使用管道时使用:
decodeSerial () {
awk -v string="$1" 'BEGIN { gsub("[][]", "", string); print toupper(substr(string,3)) }'
}
请注意,您的${serial: -6}
isbash
语法可能不适用于/bin/sh
.
答案2
你可以用 bash 做到这一点字符串操作:
serial='[4251][7c3c]' ; serial="${serial//[/}" ; serial="${serial//]/}" ; echo "${serial: -6}"
或作为函数
decodeSerial () {
serial="$1"
serial="${serial//[/}"
serial="${serial//]/}"
printf '%s\n' "${serial: -6}"
}