正则表达式匹配Bash变量

5

我正在尝试修改一个bash脚本。目前该脚本包含以下内容:

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

$1可能看起来像:

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

我想要做的是添加一个名为"base"值的图片。我大概有这样一个想法:
print "<div class=\"icon\"><imgsrc=\"icons\" $1 ".png\"></div><div class=\"title\">" $1 "</div>"

然而,在这种情况下,我希望$1仅返回Historian。我想我可以使用正则表达式来匹配$1,并仅保留我需要的部分。

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

我知道我的正则表达式还不够完善,理想情况下初学者和大师应该分别在自己的匹配组中并且不与基本内容绑定。而且我不知道如何匹配$1参数。


5
他骑着小马穿过镇子,走到了那家酒馆的门口。他下马进去,跨步走到吧台前。 - user554546
1
谢谢提供链接,但我实际上并不是在解析[x]html。我是基于一些关键词创建HTML输出。 - Brombomb
@JackManey 我认为OP要求使用bash正则表达式匹配 学徒历史学家(1级) 这种字符串。 - bezmax
3个回答

10

在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 

关键是要从BASH_REMATCH中检索正确的成员。Bash不支持非捕获括号,因此Historian位于1或2之下。幸运的是,我们知道它是最后一个。


5

纯shell示例:

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

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

(这两种情况使用相同的表达式,只是为了方便测试而重复。)

0

基于“我不知道如何匹配$1参数”的情况。

如果您询问的不是您的正则表达式是否正确,而是如何针对您的bash变量内容执行匹配,那么我是否理解您的意思?

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

$yourbashvariablecontainingthetext 应该是你的 $1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接