2014-01-03 6 views
0

Я пытаюсь проверить количество | в строке файла. В этом примере он проверяет ровно 5 баров.Regex для подсчета символов

^[\|]{5}$ 

Это проверяет 5, но не принимает во внимание/игнорирует другие символы.

Dice|Puppy|Button|Sunny|Music|Extra 

Что мне не хватает? Regex всегда меня отбрасывает.

+0

Вы говорите, что хотите проверить наличие 5 труб, и вы это сделаете. Остальная часть вашего вопроса расплывчата. Что вы хотите учитывать или игнорировать? – squiguy

+0

Можете ли вы разработать немного больше? что регулярное выражение, которое вы написали, будет соответствовать строке с 5 трубами и ничего больше. – Siddhartha

+0

Я просто хочу проверить, что строка выше имеет ровно 5 труб. Если оно больше или меньше, регулярное выражение должно быть недействительным. – Atomiklan

ответ

5

Попробуйте это регулярное выражение:

^[^|]*(\|[^|]*){4}$ 
+0

Почти правильно. Спасибо!^[^ |] + (\ | [^ |] +) {5} $ – Atomiklan

+0

OOPS! Просто понял, что мой пример щенка состоял из четырех труб. В любом случае, вы были правы! – Atomiklan

+0

Как насчет того, когда иногда вам нужно быть пустое между ними? Это регулярное выражение не будет работать для этого случая. – Atomiklan

3

Для того, чтобы подсчитать количество труб:

line='Dice|Puppy|Button|Sunny|Music' 
npipes="$(echo "$line" | tr -c -d '|' | wc -c)" 

Для того, чтобы проверить, что число труб 5:

[ "$(echo "$line" | tr -c -d '|' | wc -c)" -eq 5 ] && echo success 

В этом подходе, translate (tr) используется для удаления всех символов, кроме трубы. (Он удаляет (-d) все, кроме (-c) символ трубы). Затем подсчет слов (wc) используется для подсчета количества байтов (-c). Это число можно сравнить с 5, используя стандартный тест равенства bash (-eq).

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