Учебная страница курса биоинформатики,
год поступления 2014
Основы регулярных выражений для `grep`
Примеры и дополнения (А.Злобин)
Регулярные выражения для grep - не то же самое, что маски файлов для интерпретатора командной строки!
Например, grep -E 'ORGANISM_*SIENTIFIC' <имя файла> найдет все строки, в которых слова ORGANISM и SIENTIFIC соединены любым числом подчеркиваний (ORGANISM_SIENTIFIC, ORGANISM____SIENTIFIC, ORGANISMSIENTIFIC и т.п.)
Команда ls ORGANISM_*SINTIFIC покажет все файлы, в которых вместо "*" стоит любое число символов (ORGANISM_SINTIFIC, ORGANISM_xyzSINTIFIC и т.п.)
Вопрос: Как находить в текстовом файле строки, удовлетворяющие определенному условию, а не просто содержащие данное подслово?
Ответ: В grep реализованы три диалекта для т.н. регулярных выражений: базовый, расширенный и perl.
Рекомендуемый диалект - расширенный. Для его включения необходимо задать опцию -E:
grep -E <регулярное выражение> <файл>
Регулярным выражением являются
- символ (кроме специальных символов, описанных ниже)
точка . значит любой один символ
- список символов, обозначающий "любой один из перечисленных"
- [a7Z] либо a, либо 7, либо Z
- [a-z] любой от a до z-маленького
- [^A-Z] любой, кроме перечисленных, т.е. больших латинских букв
- специально обозначенные множества символов
[[:alnum:]] - любой алфавитный символ или цифра
[[:digit:]], [[:lower:]], [[:punct:]], [[:space:]], [[:upper:]], [[:cntrl:]] и некоторые другие
- два или более регулярных выражений, соединенных оператором "ИЛИ"
(<регулярное выражение 1>|<регулярное выражение 2>|<регулярное выражение 3>) - в круглых скобках; иногда круглые скобки можно опустить
Можно указать требуемую кратность регулярного выражения
*, например
- 'D*' обозначает любое число ( начиная от 0) идущих подряд больших букв D
+ - одно или более вхождений
? - ноль или одно вхождение
- {n} - n вхождений
- {n,} - n или более вхождений
- {n,m} - от n до m вхождений
Последовательно идущие регулярные выражения, возможно, с кратностями, значат, что все они должны встретиться в указанном порядке Например,
grep -E 'COMPND.*YES' 1khl.pdb
найдет все строки, в которых есть слова COMPND и YES, а между ними - любое количество символов
Привязка регулярного выражения к началу или концу строки:
- ^ или $ соответственно
символов [, ], \, ^, $, (, ) )
Задавать слово для поиска можно не только однозначным образом. Команда grep понимает некоторые спецсимволы, самые употребительные из которых: ^, $, . (точка), *, [ и ], а также \.
grep t..p filename вытащит из файла filename все строки, в которых встретились буквы t и p с двумя любыми символами между ними;
grep tr[iy]psin filename выдаст все строки из filename, содержащие слова tripsin или trypsin. grep 'number [0-9]' filename выдаст все строки из filename, содержащие сочетания "number 1", "number 2" и т.д. Кавычки в примере стоят, чтобы bash не воспринял "number" и "[0-9]" как отдельные параметры.
grep '^>' filename выдаст все строки из filename, начинающиеся с символа >
grep 'number [0-9]* ' filename выдаст строки с сочетаниями "number 1087 ", "number 99 " и т.п.
grep '\.ru' filename найдет строки, содержащие ".ru" (а не (любой символ)ru, как если бы \ перед точкой не стоял). Многие спецсимволы grep являются также спецсимволами bash, поэтому (а также, например, для поиска слов, содержащих пробелы) первый параметр программы лучше всегда брать в одинарные кавычки.
Программа grep имеет две важные опции, а именно -v и -c. Опция -v означает, что нужно выдать не строки, содержащие указанное слово, а наоборот, строки, его не содержащие. Опция -c означает, что надо выдать лишь число таких строк, а не сами строки.