Regex для возврата последних 3 символов соответствующего шаблона - PullRequest
1 голос
/ 25 марта 2019

Я использую grep для поиска по текстовым файлам, содержащим 88-символьные MRZ (машиночитаемые зоны). В текстовом файле им предшествует точка с запятой. Я только хочу получить подстроку символов 3-5 из строки.

Это мой шаблон:

egrep --include *.txt -or . -e ";[A-Z][A-Z0-9<][A-Z<]{3}"

Это текстовый файл:

text is here;P<RUSIVAN<<DEL<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<F64D123456RUS7404124F131009734P41234<<<<<<<8  ;2019-02-08

Это мой вывод:

;P<RUS

Это мой желаемый вывод:

RUS

Точка с запятой вводит МСЗ. Он начинается с заглавной буквы, за которой следует заглавная буква, цифра или символ заполнения <. Затем следует трехзначный код страны, который может содержать заглавные буквы или символы заполнения <.

Этот шаблон работает нормально, но я хочу только вернуть последние 3 цифры, которые я определяю количественно. Есть ли способ получить только последние 3 символа соответствующего шаблона? В примере текстового файла желаемый результат будет RUS. Спасибо!

Ответы [ 2 ]

1 голос
/ 25 марта 2019

Если вы можете использовать GNU Grep, вы можете использовать \K, который больше не будет включать в себя ни один из предыдущих совпавших символов в совпадении, а затем будет соответствовать вашему классу персонажей 3 раза:

grep -roP --include=*.txt ";[A-Z][A-Z0-9<]\K[A-Z<]{3}"
0 голосов
/ 25 марта 2019

Это все, что вы пытаетесь сделать?

$ awk -F';' '{print substr($2,3,3)}' file
RUS

$ sed -E 's/[^;]*;..(.{3}).*/\1/' file
RUS

Если нет, то отредактируйте свой вопрос, чтобы обеспечить более по-настоящему репрезентативный пример ввода / вывода.

Команда UNIX для find файлы с именем find, кстати, не grep.Я знаю, что ребята из GNU добавили кучу опций для поиска файлов в grep, но просто не используйте их, так как они делают вашу команду grep излишне сложной (и несовместимой с другими инструментами обработки текста UNIX), так как тогда ей нужны аргументы для findфайлы, а также g/re/p в файлах.Поэтому ваша командная строка, если вы используете grep, должна быть:

find . -name '*.txt' -exec grep 'stuff' {} +

not:

egrep --include *.txt -or . -e 'stuff'

и сделать то же самое для любого другого инструмента:

find . -name '*.txt' -exec grep 'stuff' {} +
find . -name '*.txt' -exec sed  'stuff' {} +
find . -name '*.txt' -exec awk  'stuff' {} +
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...