我正在尝试重新引用我的脚本,使其可读,并且仍然可以在一行中使用。
我的脚本做:
- 字符串(GXXRXXCXX(上的正则表达式,用于将所有匹配的数字放入数组
- 数组中所有字符串的字符串编号(0X->X(
- 所有带有'的数字的联接。'分隔符
- 最后,它在字符串的开头添加一个'v'
我最想引用的部分是在不使用任何tmp变量的情况下将数组编号(3 2 1(转换为联接(3.2.1(。
代码:
GOROCO=G03R02C01
version=v$(tmp=( $(grep -Eo '[[:digit:]]+' <<< $GOROCO | bc) ); echo "${tmp[@]}" | sed 's/ /./g')
过程:
G03R02C01
03 02 01
3 2 1
3.2.1
v3.2.1
使用单个sed
可以执行以下操作:
GOROCO='G03R02C01'
version=$(sed -E 's/[^0-9]+0*/./g; s/^./v/' <<< "$GOROCO")
# version=v3.2.1
详细信息:
-E
:在sed
中启用扩展正则表达式模式s/[^0-9]+0*/./g
:用一个点替换所有后跟0或更多零的非数字s/^./v/
:用字母v
替换第一个点
作为一项学术练习,这里有一个纯粹的bash等效于做同样的事情:
shopt -s extglob
version="${GOROCO//+([!0-9])*(0)/.}"
version="v${version#.}"
您正在寻找paste
$ grep -Eo '[[:digit:]]+' <<< $GOROCO | bc | paste -s -d"."
3.2.1