Adhin37
Adhin37

Reputation: 57

Shell - Refactoring a string regex that join numbers

I am trying to refacto my script to make it readable and still usable on a single line.

My script do :

The part i am strugguling the most to refacto is the array number (3 2 1) into a join (3.2.1) without using any tmp variable.

code :

GOROCO=G03R02C01
version=v$(tmp=( $(grep -Eo '[[:digit:]]+' <<< $GOROCO | bc) ); echo "${tmp[@]}" | sed 's/ /./g')

process :

G03R02C01
03 02 01
3 2 1
3.2.1
v3.2.1

Upvotes: 1

Views: 81

Answers (2)

glenn jackman
glenn jackman

Reputation: 246867

You're looking for paste

$ grep -Eo '[[:digit:]]+' <<< $GOROCO | bc | paste -s -d"."
3.2.1

Upvotes: 2

anubhava
anubhava

Reputation: 785276

Using a single sed you can do this:

GOROCO='G03R02C01'
version=$(sed -E 's/[^0-9]+0*/./g; s/^\./v/' <<< "$GOROCO")

# version=v3.2.1

Details:

  • -E: Enables extended regex mode in sed
  • s/[^0-9]+0*/./g: Replace all non-digits followed by 0 or more zero by a single dot
  • s/^\./v/: Replace first dot by a letter v

As an academic exercise here is a pure bash equivalent of doing same:

shopt -s extglob
version="${GOROCO//+([!0-9])*(0)/.}"
version="v${version#.}"

Upvotes: 5

Related Questions