转换 #!/bin/sh 中的字符串

转换 #!/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
}

只有最后六个字符可以正常工作

答案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}"
}

相关内容