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)
只有最后六个字符工作正常
$ 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调用(假设字母字符是十六进制数字,a到f):
$ 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.