Brombomb
Brombomb

Reputation: 7076

regex match bash variable

I am trying to modify a bash script. The script current contains

print "<div class=\"title\">" $1 "</div>"

Where $1 may look like:

Apprentice Historian (Level 1)
Historian (Level 4)
Master Historian (Level 7)

What i'd like to do is add an image which is named the "base" value. I had something like this in mind:

print "<div class=\"icon\"><imgsrc=\"icons\" $1 ".png\"></div><div class=\"title\">" $1 "</div>"

However, in this case I'd like $1 to only return Historian. I was thinking I could use a regex to match and on $1 and keep only the part I need.

(Apprentice|Master)?\s(.*)\s(\(Level \d\)) 

I know my regex isn't quite there, ideally apprentice/master would be in their own match group and not tied the base. And I don't know how to match on the $1 argument.

Upvotes: 5

Views: 20528

Answers (3)

choroba
choroba

Reputation: 241908

Using regex matching in bash:

for a in 'Apprentice Historian (Level 1)' 'Historian (Level 4)' 'Master Historian (Level 7)' ; do
    set "$a"
    echo " === $1 ==="
    [[ $1 =~ (Apprentice|Master)?' '?(.*)' ('Level' '[0-9]+')' ]] \
        && echo ${BASH_REMATCH[${#BASH_REMATCH[@]}-1]}
done 

The tricky part is to retrieve the correct member from BASH_REMATCH. Bash does not support non-capturing parentheses, therefore Historian is either under 1 or 2. Fortunately, we know it is the last one.

Upvotes: 9

user unknown
user unknown

Reputation: 36229

Samples pure shell:

a="Historian (Level 1)"
noParens=${a/ \(*/}
lastWord=${noParens/[A-Za-z]* /}

a="Muster Historian (Level 1)"
noParens=${a/ \(*/}
lastWord=${noParens/[A-Za-z]* /}

(It's the same expressions in both cases, just repeated for easy testing).

Upvotes: 5

Kristofer
Kristofer

Reputation: 3269

Based on "And I don't know how to match on the $1 argument."

Have I understood you correctly if what you are asking for is not whether your regex is correct but rather how to perform the match against the contents of your bash variable?

matched_text=$(echo $yourbashvariablecontainingthetext | sed 's/your_regex/backreference_etc/')

$yourbashvariablecontainingthetext should be your $1

Upvotes: 0

Related Questions