Shell - 重构连接数字的字符串正则表达式

Shell - Refactoring a string regex that join numbers

我正在尝试重构我的脚本以使其可读并且仍然可以在一行中使用。

我的脚本做:

我最难以重构的部分是在不使用任何 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