2015-07-07 3 views
5

В сценарии bash мне нужно сопоставить строки, которые начинаются ровно 3 раза со строки lo; поэтому lololoba хорошо, loloba - плохой, lololololoba - хорошо, balololo - плохой.Как совместить строку (с регулярным выражением), которая начинается со строки

Я пробовал использовать этот шаблон: "^$str1/{$n,}", но он не работает, как я могу это сделать?

EDIT:

Согласно OPS комментарий, lololololoba сейчас плохо.

+1

насчет '(вот) {3}'? – NightShadeQueen

+3

Значит, более 3 вхождений 'lo' тоже хороши? – anubhava

+3

@anubhava Я думаю, что это «точно», это сбивает с толку. – 123

ответ

3

Вы можете использовать следующие регулярные выражения:

^(lo){3}.*$ 

Вместо lo вы можете поместить переменную.

См демонстрационная https://regex101.com/r/sI8zQ6/1

+3

Нет необходимости в '. * $' - он ничего не полезен. Кроме того, хотя это правильное регулярное выражение, это не полный ответ, не показывающий, как его использовать (например, с помощью команды grep -E). –

+1

В чем смысл \ 1? Почему бы не просто совместить строку 3 раза? – 123

+0

@TomFenech Да, вы правы, но я хотел дать подсказку, а не полный ответ! – Kasramvd

6

Это должно работать:

pat="^(lo){3}" 
s="lolololoba" 
[[ $s =~ $pat ]] && echo good || echo bad 

EDIT (согласно ФОС комментарии):

Если вы хотите, чтобы соответствовать точно в 3 раза (т.е. lolololoba и таковые должны не имеют аналогов):

изменить pat="^(lo){3}" на:

pat="^(lo){3}(l[^o]|[^l].)" 
+0

Это прекрасно! благодаря! – Jaeger

0

Вы можете использовать эту awk, чтобы соответствовать точно 3 вхождений lo в начале:

# input file 
cat file 
lololoba 
balololo 
loloba 
lololololoba 
lololo 

# awk command to print only valid lines 
awk -F '^(lo){3}' 'NF == 2 && !($2 ~ /^lo/)' file 
lololoba 
lololo 
0

В соответствии с Вашим комментарием:

... more than 3 is bad so "lolololoba" is not good! 

Вы найдете, что @ Ответ Джахида не подходит (поскольку он дает вам «хорошее» для этой тестовой строки.

Чтобы использовать свой ответ с правильным регулярным выражением:

pat="^(lo){3}(?\!lo)" 
s="lolololoba" 
[[ $s =~ $pat ]] && echo good || echo bad 

Это подтверждает, что есть три «Lo» s в самом начале, а не другой один сразу же после трех.

Обратите внимание, что если вы используете Баш вы должны избежать этого ! в первой строке (что выше делает мое регулярное выражение)

+0

's =" lololoba "' дает плохие – Jahid

+0

Я добавил еще один шаблон, если вы заинтересованы. – Jahid

Смежные вопросы