Shell - 重构连接数字的字符串正则表达式
Shell - Refactoring a string regex that join numbers
我正在尝试重构我的脚本以使其可读并且仍然可以在一行中使用。
我的脚本做:
- 字符串 (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
:用一个点 替换所有non-digits后跟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
我正在尝试重构我的脚本以使其可读并且仍然可以在一行中使用。
我的脚本做:
- 字符串 (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
:用一个点 替换所有non-digits后跟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