Home > Software design >  Match if variable has WORD repeated more than once
Match if variable has WORD repeated more than once

Time:05-01

I have this output:

>echo $br_name
srxa wan-a1 br-wan3-xa1 0A:AA:DD:C1:F1:A3 ge-0.0.3 srxa wan-a2 br-wan3-xa2 0A:AA:DD:C1:F2:A3 ge-0.0.3

I am trying to create a conditional where it detects whether ge-0.0.3 is repeated more than 1 time in my variable "$br_name"

for example:

if [[ $br_name has ge-0.0.3 repeated more than one time ]]
then
    echo "ge-0.0.3 is shown more than once"
else
    :
fi

CodePudding user response:

Bash's =~ is using extended RE.

[Bash-5.2] % check() { local s='(ge-0\.0\.3.*){2,}'; [[ "$1" =~ $s ]] && echo yes || echo no; }
[Bash-5.2] % check 'xxx'
no
[Bash-5.2] % check 'ge-0.0.3'
no
[Bash-5.2] % check 'ge-0.0.3 ge-0.0.3 '
yes
[Bash-5.2] % check 'ge-0.0.3 ge-0.0.3 ge-0.0.3 '
yes

CodePudding user response:

You can use grep -o to print only the matched phrase. Also use -F to make sure that it matches literal characters instead of a regex where . and - are special

if [[ $(echo $br_name | grep -Fo ge-0.0.3 | wc -l) -gt 1 ]]; then
    echo "ge-0.0.3 is shown more than once"
else
    echo "only once"
fi

For more complex patterns of course you can drop -F and write a proper regex for grep

CodePudding user response:

simple word

If your word would be "easy", you can detect the occurrences count with:

echo "123 123 123" | sed "s/123 /123\n/g" | wc -l

In which the word is replace for the same but with \n and then wc count the lines

or you can try one of these:

  • demo

    grep

    With grep you can get the ocurrence count

    ocurrences=( $(grep -oE '(ge-0\.0\.3)' <<<$1) )
    ocurrences_count=${#ocurrences[*]}
    echo $ocurrences_count
    

    enter image description here

  • Related