使用bash转换字符串

使用bash转换字符串,bash,grep,Bash,Grep,我要转换命令的输出: dmidecode -s system-serial-number 这是一个如下所示的字符串: VMware-56 4d ad 01 22 5a 73 c2-89 ce 3f d8 ba d6 e4 0c 致: 我想我首先需要提取“VMware-”后面的所有字母和数字,然后在字符10、14、18、22后面的已知位置插入“-” 要尝试我尝试过的第一次提取: $ echo `dmidecode -s system-serial-number | grep -oE '(VMw

我要转换命令的输出:

dmidecode -s system-serial-number
这是一个如下所示的字符串:

VMware-56 4d ad 01 22 5a 73 c2-89 ce 3f d8 ba d6 e4 0c
致:

我想我首先需要提取“VMware-”后面的所有字母和数字,然后在字符10、14、18、22后面的已知位置插入“-”

要尝试我尝试过的第一次提取:

$ echo `dmidecode -s system-serial-number | grep -oE '(VMware-)?[a0-Z9]'`
VMware-5 6 4 d a d 0 1 2 2 5 a 7 3 c 2 8 9 c e 3 f d 8 b a d 6 e 4 0 c
然而,这不是正确的方向

编辑:

这使我得到了一个日志字符串,但它并不优雅:

$ echo `dmidecode -s system-serial-number | sed -s "s/VMware-//" | sed -s "s/-//" | sed -s "s/ //g"` 
564dad01225a73c289ce3fd8bad6e40c
像这样:

dmidecode -s system-serial-number | 
    sed -E 's/VMware-//;
            s/ +//g;
            s/(.)/\1-/8;
            s/(.)/\1-/13;
            s/(.)/\1-/23'
像这样:

dmidecode -s system-serial-number | 
    sed -E 's/VMware-//;
            s/ +//g;
            s/(.)/\1-/8;
            s/(.)/\1-/13;
            s/(.)/\1-/23'
您可以使用Bash:

或者,仅内置(即,无
tr
):

您可以使用Bash:

或者,仅内置(即,无
tr
):


您只能使用带有此参数扩展的内置项来删除空格:
echo“${s//}”
您只能使用带有此参数扩展的内置项来删除空格:
echo“${s//}”
\s
仅为GNU使用。替换
s/\s+//g
s/+//g对于POSIX SED…
\s
仅为GNU SED。替换
s/\s+//g
s/+//g用于POSIX SED。。。
$ s="VMware-56 4d ad 01 22 5a 73 c2-89 ce 3f d8 ba d6 e4 0c"
$ s1=$(echo "${s:7}" | tr -d '[:space:]')
$ echo "${s1:0:8}-${s1:8:4}-${s1:12:9}-${s1:21}"
564dad01-225a-73c2-89ce-3fd8bad6e40c
$ s1=${s:7}
$ s1="${s1// /}"
$ echo "${s1:0:8}-${s1:8:4}-${s1:12:9}-${s1:21}"