2012-02-15 215 views
4

我想修改一個bash腳本。該腳本當前包含正則表達式匹配bash變量

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

$1可能看起來像:

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

什麼,我想要做的就是添加它被命名爲「基地」值的圖像。我腦子裏想的是這樣的:

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

然而,在這種情況下,我想$1只返回Historian。我在想我可以使用正則表達式來匹配$1並且只保留我需要的部分。

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

我知道我的正則表達式是不能令人信服,非常徒弟/主會在自己的比賽組和基礎沒有太大的關係。我不知道如何匹配$1的論點。

+3

[小馬他來...](http://stackoverflow.com/a/1732454/554546) – 2012-02-15 07:09:03

+1

感謝您的鏈接,但我實際上並沒有解析[x] html。我實際上是基於幾個關鍵字創建一個html輸出。 – Brombomb 2012-02-15 07:13:04

+0

@JackManey我認爲OP要求使用bash將'Apprentice Historian(Level 1)'類型的字符串正則表達。 – bezmax 2012-02-15 07:13:26

回答

9

使用正則表達式匹配:

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之內。幸運的是,我們知道這是最後一個。

0

基於「我不知道如何匹配$ 1的論點。」

我是否正確地理解了你,如果你要求的不是你的正則表達式是否正確,而是如何對你的bash變量的內容執行匹配?

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

$ yourbashvariablecontainingthetext應該是你的$ 1

5

樣品純殼:

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

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

(這是在兩種情況下,同樣的表情,只是重複簡單的測試)。在bash