简体   繁体   中英

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.

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.

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).

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM