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

use*_*909 1 linux shell string text-processing

嗨,我有这样的输出

[4251][7c3c]
Run Code Online (Sandbox Code Playgroud)

我需要得到

517C3C
Run Code Online (Sandbox Code Playgroud)

我试过了

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
}
Run Code Online (Sandbox Code Playgroud)

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

Kus*_*nda 5

$ echo '[4251][7c3c]' | tr -d '[]' | tr '[:lower:]' '[:upper:]' | cut -c 3-
517C3C
Run Code Online (Sandbox Code Playgroud)

作为一个函数:

$ echo '[4251][7c3c]' | tr -d '[]' | tr '[:lower:]' '[:upper:]' | cut -c 3-
517C3C
Run Code Online (Sandbox Code Playgroud)

管道从输入中删除所有[]字符,将所有小写字符转换为大写字符,并从结果中丢弃前两个字符。


通过一次sed调用(假设字母字符是十六进制数字,af):

$ echo '[4251][7c3c]' | sed 's/[][]//g; y/abcdef/ABCDEF/; s/^..//'
517C3C
Run Code Online (Sandbox Code Playgroud)

要保留最后六个字符而不是删除前两个字符,此sed调用可能会更改为

sed 's/[][]//g; y/abcdef/ABCDEF/; s/^.*\(.\{6\}\)$/\1/'
Run Code Online (Sandbox Code Playgroud)

使用awk

$ echo '[4251][7c3c]' | awk '{ gsub("[][]", ""); print toupper(substr($1,3)) }'
517C3C
Run Code Online (Sandbox Code Playgroud)

awk在你的函数中使用命令(sed上面的命令可以以类似的方式插入):

decodeSerial () {
    printf '%s\n' "$1" |
    tr -d '[]' |
    tr '[:lower:]' '[:upper:]' |
    cut -c 3-
}
Run Code Online (Sandbox Code Playgroud)

awk在 shell 函数中不使用管道使用:

$ echo '[4251][7c3c]' | sed 's/[][]//g; y/abcdef/ABCDEF/; s/^..//'
517C3C
Run Code Online (Sandbox Code Playgroud)

请注意,您的${serial: -6}isbash语法可能不适用于/bin/sh.