Почему это регулярное выражение не захватывает обе совпадающие строки?

У меня есть следующий текстовый файл:

a
a

Я пытаюсь сопоставить строки, начинающиеся с a, используя следующую команду: pcregrep -M '^a'. Соответствует только первому a, а не второму. Кто-нибудь знает почему? Я использую pcregrep, потому что это простая проблема, которую я расширю до более сложных сценариев позже.

Спасибо!

ОБНОВЛЕНИЕ

Причина в том, что я использую Mac OS, в которой каждая новая строка - это возврат каретки. Из-за этого pcregrep интерпретирует содержимое файла (который представляет собой \ ra) как одну строку, а мое регулярное выражение возвращает только первый a из этой строки, поскольку это все, что я указал в выражении. Решением этой проблемы с помощью pcregrep является указание типа новой строки. «Тип новой строки» означает символ, который механизм Regex интерпретирует как обозначающий конец строки. Таким образом, если мы укажем в этом случае, что тип новой строки - возврат каретки (\ r), pcregrep будет интерпретировать содержимое моего файла как две строки, сопоставить и вернуть обе.

Фиксированная версия моего регулярного выражения - pcregrep -M -N CR '^a', где -N CR означает «тип новой строки - возврат каретки».


person gkeenley    schedule 04.06.2019    source источник
comment
Окончание строки CR? Я только что протестировал, и все работает нормально.   -  person Wiktor Stribiżew    schedule 04.06.2019
comment
Вы уверены, что перенос строки является правильным переносом строки для системы, в которой вы запускаете grep? ... CR-LF, если он находится на ПК? или вы извлекали данные из системы Linux или Mac без преобразования переносов строк?   -  person    schedule 04.06.2019
comment
@ WiktorStribiżew Что означает CR?   -  person gkeenley    schedule 04.06.2019
comment
возврат каретки, \x0D или \r char.   -  person Wiktor Stribiżew    schedule 04.06.2019
comment
@ WiktorStribiżew Я не уверен ... Я сделал разрыв строки, просто нажав Enter. VsCode в OS X. Почему это важно?   -  person gkeenley    schedule 04.06.2019
comment
Вот и все: Mac OSX. Разрывы строк по умолчанию - только CR.   -  person Wiktor Stribiżew    schedule 04.06.2019
comment
Ах, к. Вы знаете, как я мог это обойти?   -  person gkeenley    schedule 04.06.2019
comment
Я смотрю документы и не уверен, что понимаю, что на самом деле делает опция -N. Итак, OS X интерпретирует любую новую строку как возврат каретки, верно? Если да, то что делает -N? Я пробовал использовать его со всеми разными значениями (-N ANY и т. Д.), Но пока ничего не работает ...   -  person gkeenley    schedule 04.06.2019
comment
Ах, поцарапайте это, -N CR действительно работает. Спасибо! Вы хотите написать это в качестве ответа, чтобы я мог одобрить?   -  person gkeenley    schedule 04.06.2019
comment
Да, было бы на самом деле. Я буду голосовать за ваши ответы.   -  person gkeenley    schedule 04.06.2019
comment
@ WiktorStribiżew Я обновил свой первоначальный пост. Дай мне знать, если ты думаешь, что я там что-то не так понял.   -  person gkeenley    schedule 04.06.2019
comment
Если мой ответ сработал, пожалуйста, примите его.   -  person Wiktor Stribiżew    schedule 09.03.2020


Ответы (1)


Поскольку вы создали текстовый файл в MasOS, окончания строк представлены символом CR (возврат каретки) (\r, \x0D, символ с индексом 13 в таблице ASCII).

По умолчанию pcregrep и другие подобные инструменты рассматривают \n, символ LF (перевод строки), как символ разрыва строки.

Вы должны указать pcregrep использовать CR в качестве символов разрыва строки, используя параметр -N:

pcregrep -o -N CR '^a' file
            ^^^^^
person Wiktor Stribiżew    schedule 08.06.2019