Intereting Posts
Конвенция для основной структуры развертывания приложений на Unix-подобном сервере приложений При зеркалировании всей корневой зоны rpool вам нужно установить загрузочный блок? Freeradius Ошибка привязки к порту для порта 0.0.0.0 1812 Как определить процесс доступа к порту USB (масштаб)? Передача именованных аргументов в виде массива в сценарии оболочки Найти файлы и каталоги, доступные для записи Установка разделяемой библиотеки – вопросы и проблемы Создание точечного скрипта Скопировать несколько файлов в один (добавить, слить) в один вызов без перенаправления оболочки? Fedora 19 зависает после входа в систему Как показать простой режим работы в строке состояния tmux? Как использовать закрытый ключ для настройки без пароля ssh на новом компьютере описание порядка сортировки Проблема с доступом к / из разных разделов Как отключить автоматическое обновление правильного количества GPU для каждого узла MOM в Torque?

grep эквивалент регулярного выражения kwrite +

Итак, мне потребовались годы, но я, наконец, научился мыслить с точки зрения регулярных выражений, благодаря использованию их в kwrite .

Но я до сих пор не знаю, как перевести это знание в grep . Мне нравится мой grep , когда я знаю, что я с ним делаю, но руководство всегда давало мне головную боль.

Я хотел бы сопоставить такие вещи, как следующие строки:

 КАПИТАЛЫ СЛЕДУЮЩАЯ ПЕРЕДАЧА.
 АЛО
 TALSFOLL
 ANEW.

То есть строки, начинающиеся с двух или более заглавных букв. Но я не могу понять, как это сделать.

В kwrite я бы соответствовал этим строкам, используя:

 \n[AZ][AZ]+ 

Но grep … хм. У меня такое чувство, что это что-то вроде:

 me@ROOROO:~/$ grep "^[AZ]something" filename 

но

 me@ROOROO:~/$ grep "^[AZ][AZ]+" filename 

не работает (возвращает пустой файл). Поиск google для термина grep соответствует одному или нескольким событиям, заставляет меня поверить, что

 me@ROOROO:~/$ grep "^[AZ][AZ]*" filename 

был правильным синтаксисом. Но, увы, это не делает трюк.

В первом примере вы используете правильный синтаксис; проблема + считается специальной при использовании расширенных регулярных выражений. На странице man реализации GNU grep :

Базовые и расширенные регулярные выражения

В основных регулярных выражениях метасимволы?, +, {, |, (, И) теряют свое особое значение; вместо этого используйте backslashed версии \ ?, \ +, \ {, \ |, \ (, и \).

( \? \+ , и \| – нестандартные расширения GNU, хотя).

Таким образом, вам либо нужно избежать + (предполагая GNU grep или совместимый):

 $ grep "^[AZ][AZ]\+" filename 

Используйте стандартный \{1,\} эквивалент GNU \+ :

 $ grep '^[AZ][AZ]\{1,\}' filename 

или даже здесь:

 $ grep '^[AZ]\{2,\}' filename 

Или включите расширенные регулярные выражения, передав grep флаг -E или просто запустив egrep ( egrep – это команда, которая ввела эти расширенные регулярные выражения в конце 70-х):

 $ grep -E "^[AZ][AZ]+" filename $ egrep "^[AZ][AZ]+" filename 

В любом случае все они будут функционально эквивалентны:

 $ grep '^[AZ][AZ]' filename 

Таким образом, вам даже не нужен оператор + .

В другом примере вы попытались:

 $ grep "^[AZ][AZ]*" filename 

* работает в основных регулярных выражениях, но он соответствует 0 или более раз, а не 1 или больше. Решение в вашем ответе работает, потому что оно говорит «сопоставить капитал, затем еще один капитал, затем 0 или более капиталов». Метод в вопросе говорит, что «сопоставить столицу, затем 1 или более столиц», то же самое. Вы также можете использовать {min,max} чтобы точно указать, сколько вы хотите, и если вы не учитываете max он позволяет любое число (для этого также требуются расширенные регулярные выражения):

 $ egrep "^[AZ]{2,}" 

(в качестве примечания к истории, egrep первоначально не поддерживал {min,max} (и до сих пор не используется в Solaris 11 /bin/egrep ). \{min,max\} поддержка была добавлена ​​в grep до {min,max} \{min,max\} {min,max} был добавлен к egrep (который в случае egrep нарушил обратную совместимость)).

Вам просто нужно добавить дополнительный [AZ]. Так что это

 me@ROOROO:~/$ grep "^[AZ][AZ][AZ]*" filename 

Похоже, вам нужна поддержка regexp от perl . Форма man grep :

  -P, --perl-regexp Interpret PATTERN as a Perl regular expression. This is highly experimental and grep -P may warn of unimplemented features. 

Таким образом, grep -P "^[AZ][AZ]+" может быть более полезным.