2012-02-15 4 views
4

Я пытаюсь изменить скрипт bash. Текущий сценарий содержитregex match bash variable

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

+1

Спасибо за ссылку, но я на самом деле не разбираюсь [x] html. Я на самом деле создаю html-выход на основе нескольких ключевых слов. – Brombomb

+0

@JackManey Я думаю, что OP запрашивает регулярное выражение 'Apprentice Historian (Level 1)' типа строки с использованием bash. – 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?

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]* /} 

(Это те же выражения в обоих случаях, только неоднократных для простого тестирования).