Как сохранить каждую группу захвата регулярного выражения bash?

Чтобы сделать это действительно простым, я должен использовать регулярное выражение для выбора строки в сложном файле. Я хотел бы «сохранить» в файле часть выбора регулярного выражения. Итак, я использую группы захвата и... я не знаю, как использовать результат.

Например: list.txt:

азбука 123 деф 456

Вот мое регулярное выражение с группой захвата:

(\d{3}) (\w{3})

Например, команда оболочки с grep (может быть что-то еще, мне все равно):

egrep '(\d{3}) (\w{3})' list.txt

Как сохранить или использовать все результаты \d{3} и \w{3}? я не могу просто использовать

egrep '\d{3}' > digit.txt

Потому что группа захвата — это всего лишь небольшая часть большого регулярного выражения.

Спасибо


person A D    schedule 14.09.2018    source источник
comment
Может быть, это поможет?   -  person Jeff Holt    schedule 14.09.2018
comment
egrep вообще не является регулярным выражением оболочки -- grep является внешней командой, не являющейся частью оболочки, и оболочка не имеет доступа к ее состоянию. Собственный синтаксис регулярных выражений оболочки больше похож на re='([[:digit:]]{3} ([^[:space:]]+)'; [[ $str =~ $re ]], который сохранит ваши группы захвата в переменной оболочки BASH_REMATCH. (Обратите внимание, что синтаксис там базовый ERE -- \d и \w являются расширениями, взятыми из PCRE; некоторые платформы предлагают их, другие нет, и небезопасно предполагать, что они будут доступны, поскольку какие функции доступны в регулярных выражениях нативной оболочки. зависит от локальной библиотеки C).   -  person Charles Duffy    schedule 14.09.2018
comment
См. раздел группы захвата замены bash.   -  person Charles Duffy    schedule 14.09.2018
comment
Не могли бы вы отредактировать свой вопрос и добавить несколько строк и ожидаемый результат?   -  person Toto    schedule 15.09.2018


Ответы (2)


sed тоже будет работать:

sed 's/.*\([0-9][0-9][0-9] [a-z][a-z][a-z]\).*/\1/' ./list.txt

Извините, мой старый виртуальный компьютер с Ubuntu, похоже, не поддерживает ярлыки \d или \w.

person Gary_W    schedule 14.09.2018
comment
Это касается не только вашей старой виртуальной машины — \d или \w не являются частью даже самой последней версии стандарта POSIX ERE; они не должны работать. См. pubs.opengroup.org/onlinepubs/9699919799/basedefs/. - person Charles Duffy; 14.09.2018
comment
Это был просто очень простой пример. Я использую группы захвата, потому что мое регулярное выражение большое и сложное, и экспорт всего результата, я думаю, мне не поможет. Большое регулярное выражение предназначено для выбора нескольких строк в большом файле. Группа захвата, чтобы выбрать небольшую часть этих больших строк. Я могу найти что-нибудь с помощью grep и cut... - person A D; 14.09.2018
comment
@CharlesDuffy Спасибо за информацию - person Gary_W; 15.09.2018

Я нашел решение с помощью ${BASH_REMATCH[1]} и ${BASH_REMATCH[2]}.

person A D    schedule 15.09.2018