2012-02-15 10 views
4

私はbashスクリプトを修正しようとしています。スクリプト電流が正規表現と一致するbash変数

含ま $1がどのように見えるかもしれ
print "<div class=\"title\">" $1 "</div>" 

:私が何をしたいのですがどのような

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

+1

リンクをありがとうが、私は実際に[x] htmlを解析していません。私は実際にいくつかのキーワードに基づいてHTML出力を作成しています。 – Brombomb

+0

@JackManey私は、OPはbashを使って 'Apprentice Historian(Level 1)'のような文字列を正規表現するよう求めていると思います。 – bezmax

答えて

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変数の内容との一致をどうやって実行するかです。

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

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

(それはちょうど簡単なテストのために繰り返され、どちらの場合も同じ表現です):

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

$ yourbashvariablecontainingthetextはあなたの$ 1

5

サンプル純粋シェルでなければなりません。 bashで