2013-11-11 3 views
2

У меня есть файлы с несколькими строками и определенным символом, который может появляться только один раз (во всем файле); Мне нужен способ проверить, какие файлы хранятся.Соответствующие строки Regexp с максимальным одним символом

Скажем, у меня есть

1. 00000 
2. 00050 
3. 05500 
4. 00000 

Пять может произойти только один раз. Как я могу пометить этот файл как неверный с помощью bash и grep?

Предположим, вы сначала проверили, какие строки содержат 5. Если есть несколько строк, остановитесь. Затем посмотрите, есть ли в этой строке более пяти, если так, остановитесь. Есть лучший способ сделать это?

Прямо сейчас я бы сосчитать линии через

grep "5" file | wc -l. 

Если есть больше чем один, остановить. Если нет, перейдите к одной строке. Как мне подсчитать, сколько у них 5? Сначала я использовал 5 {1}, но это, похоже, не работает - если строка «55», она просто соответствует каждому из них 5, тогда как мне нужно максимум 1 пять. Затем я подумал, что я увижу, есть ли более 5, и если да, остановитесь. Но 5 {2,} работает только тогда, когда между ними пять раз. С другой стороны, только

.*5.*5.* 

матчи слов с 2 или более 5, но это кажется настолько гротескно ...

Все лучшие предложения? Я уверен, что есть, но это вечер, и это до того, как мой мозг идет сегодня, извините. Помните, я могу использовать только grep.

+2

как насчет: '^ [^ 5] * 5 [^ 5] * $' –

+0

Почему вы можете использовать grep - это домашнее задание? –

ответ

2

Чтобы строка содержит только одно вхождение 5, использовать регулярное выражение шаблон

^[^5]*5[^5]*$ 

Если один или никакое вхождение 5 не требуется, использовать регулярное выражение шаблон

^[^5]*5?[^5]*$ 

Если вы хотите, чтобы они соответствовали строки, содержащие более одного случая 5, используйте шаблон регулярного выражения

5.*5 
+0

Используйте 'grep -P' ... –

+0

Спасибо! 1 и 3 работают отлично, но я не могу заставить 2 работать, даже когда я использую -p. В настоящее время я делаю 'grep -P"^[^ 3] * 3 \? [^ 3] * $ "файл", но это не работает. Не убежать? тоже. Возможно, проблема с Cygwin? –

+0

@jns - С '-P' не избежать вопросительного знака! Используйте 'grep -P"^[^ 3] * 3? [^ 3] * $ "file' –

0

Вы можете сделать:

grep -o 5 file | wc -w 


Объяснение:
grep -o - выводит только "спички" (в вне случае, "5" 'ы)
wc -w - подсчитывает "слова" (жетоны)

+0

Downvoting без комментариев lame ... – alfasin

+0

Этот флаг -o ... Я сделал RTFM, но как-то пропустил это. Теперь я чувствую себя глупо: (но спасибо. –

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