У меня есть это регулярное выражение:
(?<=prefix).*$
который возвращает любой символ, следующий за строкой «prefix», и отлично работает на любых онлайн-движках регулярных выражений (например, https://regex101.com ). Проблема в том, что я использую это регулярное выражение в bash:
grep '(?<=prefix).*$' <<< prefixSTRING
это ничего не соответствует. Почему это регулярное выражение не работает с grep?
grep
regular-expression
mark009
источник
источник
.*$
сопоставляется любая строка до конца строки (или конца строки), а не только один символ.Ответы:
Кажется, вы определили правильное регулярное выражение, но не установили достаточные флаги в командной строке,
grep
чтобы понять его. Потому что по умолчаниюgrep
поддерживает BRE, а с-E
флагом - ERE. То, что у вас есть (прогноз), доступно только в виде регулярного выражения PCRE, которое поддерживается только в GNUgrep
с его-P
флагом.Предполагая, что вам нужно извлечь только совпадающую строку после
prefix
того, как вам нужно добавить дополнительный флаг,-o
чтобы сообщить,grep
что печатать только соответствующую часть какСуществует также версия,
grep
которая поддерживает библиотеки PCRE по умолчанию -pcregrep
в которой вы можете просто сделатьПодробное объяснение различных разновидностей регулярных выражений объясняется в этом замечательном ответе Джайлса и инструментах, которые реализуют каждый из них.
источник
Регулярные выражения бывают разных вкусов. То, что вы показываете, представляет собой Perl-подобное регулярное выражение (PCRE, «Perl-совместимое регулярное выражение»).
grep
делает POSIX регулярные выражения. Это базовые регулярные выражения (BRE) и расширенные регулярные выражения (ERE, еслиgrep
используется с-E
опцией). См. Руководствоre_format
илиregex
аналогичное руководство, на котороеgrep
ссылается ваше руководство в вашей системе, или стандартные тексты POSIX, на которые я только что ссылался.Если вы используете GNU
grep
, вы сможете использовать Perl-подобные регулярные выражения, если используете опцию, специфичную дляgrep
GNU .grep
-P
Также обратите внимание, что по умолчанию
grep
возвращает строки , а не подстроки из строк. Опять же, с GNUgrep
(и некоторыми другимиgrep
реализациями) вы можете использовать эту-o
опцию, чтобы получать только те биты, которые соответствуют заданному выражению из каждой строки.Обратите внимание, что оба
-P
и-o
являются нестандартными расширениями спецификации POSIXgrep
.Если вы не используете GNU
grep
,sed
вместо этого вы можете использовать бит между строкойprefix
и концом строки:Для этого нужно только напечатать строки, которым
sed
удается применить данную замену. Подстановка заменит всю строку, которая соответствует выражению (которое является BRE), тем фрагментом, который следует за строкойprefix
.Обратите внимание, что если
prefix
в строке есть несколько экземпляров ,sed
вариант вернет строку после последней , аgrep
вариант GNU вернет строку после первой (которая будет включать другие экземплярыprefix
).sed
Решение будет переноситься на всех Unix-подобные системы.источник
Как указывалось в других ответах,
grep
не используется выражение regex с lookbehinds (по умолчанию с GNUgrep
или не используется с другими версиями).Если вы не можете использовать GNU
grep
илиpcregrep
, вы можете использовать его,perl
если он у вас есть.Эквивалент командной строки с
perl
:Вы помещаете желаемое регулярное выражение между слешами. Так как вы используете Perl, в нем используется регулярное выражение Perl .
источник
print "$&\n" if ...
если они хотят вывести только часть послеprefix