vcatafesta
vcatafesta

Reputation: 73

regex - split string

I need to splite string with file name, in 5 parts, as an example below:

#!/usr/bin/env bash

str="python-zope-proxy-4.3.5-1-x86_64.chi.zst"
pkg_re='(.+)-[^-]+-[0-9]+-([^.]+)\.chi.zst*'

[[ $str =~ $pkg_re ]] &&
   pkg_base = ${BASH_REMATCH[1]}
   pkg_arch = ${BASH_REMATCH[2]}

echo $pkg_base
echo $pkg_arch

The blocks must be as follows:

block 1 - python-zope-proxy # pkg_base
block 2 - 4.3.5-1           # pkg_version_build
block 3 - 4.3.5             # pkg_version
block 4 - 1                 # pkg_build
block 5 - x86_64            # pkg_arch

With the regex below, I get block 1 and block 5, as shown above.

str="python-zope-proxy-4.3.5-1-x86_64.chi.zst"
pkg_re='(.+)-[^-]+-[0-9]+-([^.]+)\.chi.zst*'

[[ $str =~ $pkg_re ]] &&
    pkg_base = ${BASH_REMATCH[1]}
    pkg_arch = ${BASH_REMATCH[2]}

The expression would also have to treat as file name strings in the following cases:

str="python-4.3.5-1-x86_64.chi.zst"
str="python-zope-4.3.5-1-x86_64.chi.zst"
str="python-zope-proxy-4.3.5-1-x86_64.chi.zst"

Upvotes: 2

Views: 125

Answers (2)

The fourth bird
The fourth bird

Reputation: 163457

You could add nested capturing groups to get the values. Note to escape the last dot and remove the asterix after t* as it will match 0+ times a t

(.+)-(([^-]+)-([0-9]+))-([^.]+)\.chi\.zst

See a regex demo and a bash demo

Upvotes: 3

markp-fuso
markp-fuso

Reputation: 34916

Leaning more towards the K.I.S.S. principle ... a solution based on parameter expansions:

str="python-zope-proxy-4.3.5-1-x86_64.chi.zst"

block1="${str//-[0-9].*/}"

block2="${str//${block1}-/}"
block2="${block2%-*}"

block3="${block2%%-*}"

block4="${block2#*-}"

block5="${str//${block1}-${block2}-/}"
block5="${block5%%.*}"

echo "block1:${block1}:"
echo "block2:${block2}:"
echo "block3:${block3}:"
echo "block4:${block4}:"
echo "block5:${block5}:"

This generates:

block1:python-zope-proxy:
block2:4.3.5-1:
block3:4.3.5:
block4:1:
block5:x86_64:

Running against the three samples:

for str in "python-4.3.5-1-x86_64.chi.zst" "python-zope-4.3.5-1-x86_64.chi.zst" "python-zope-proxy-4.3.5-1-x86_64.chi.zst"
do
    echo "+++++++++++ ${str}"
    ... block1-block5 processing (copy from above) ...
done

And this generates:

+++++++++++ python-4.3.5-1-x86_64.chi.zst
block1:python:
block2:4.3.5-1:
block3:4.3.5:
block4:1:
block5:x86_64:
+++++++++++ python-zope-4.3.5-1-x86_64.chi.zst
block1:python-zope:
block2:4.3.5-1:
block3:4.3.5:
block4:1:
block5:x86_64:
+++++++++++ python-zope-proxy-4.3.5-1-x86_64.chi.zst
block1:python-zope-proxy:
block2:4.3.5-1:
block3:4.3.5:
block4:1:
block5:x86_64:

Upvotes: 3

Related Questions