GREP в списке регулярных выражений и включить группы захвата в виде отдельных полей в выходных данных

#bash #grep

#баш #grep

Вопрос:

Допустим, у меня есть два файла

File_1, который содержит список идентификаторов пользователя и URL-адреса (данные разделены табуляцией)

Образец первых 3 строк

 user_1       https://www.truecar.com/prices-new/honda/cr-v
user_2       https://www.truecar.com/prices-new/mazda/cx-5
user_3       https://www.edmunds.com/new-cars
 

File_2, который содержит список регулярных выражений с 3 группами захвата.

Пример первых 2 строк:

 (truecar.com)/prices-new/([^/] )/([^/] ) 
(truecar.com)/comparison/([^/] )/([^/] )
 

Я хочу вывести содержимое file_1, а также добавить соответствующие группы захвата при сопоставлении в виде 3 отдельных полей. Результат будет выглядеть примерно так. Для простоты предположим, что ни одна из групп захвата не является необязательной.

 user_1       https://www.truecar.com/prices-new/honda/cr-v    truecar.com    honda    cr-v
user_2       https://www.truecar.com/prices-new/honda/cr-v    truecar.com    mazda    cx-5
 

Как я могу этого добиться? Моя попытка до сих пор

 cat file_1 | egrep -f file_2
 

Скрипка с регулярным выражением

Комментарии:

1. Поэтому используйте sed для редактирования потока.

2. Должна ли каждая строка File_1 сопоставляться с регулярным выражением, расположенным в первой строке File_2?

3. @M.NejatAydin В file_2 существует несколько шаблонов регулярных выражений. Я включил только первую строку в качестве образца.

4. Я бы предложил обновить вопрос, включив в него пример как File_2 минимум с 2 строками / шаблонами; ответ, основанный на предположении об одном шаблоне (from File_2 ), будет (относительно) простым ответом по сравнению с ответом, основанным на нескольких шаблонах (from File_2 ); еще лучше было бы использовать образцы шаблонов, которые имеютдругое количество групп захвата (при условии, что указанный сценарий возможен в вашем env); более полный образец (который соответствует вашей реальной проблеме)… чем больше шансов получить работоспособное решение

5. если sed решение на основе приемлемо… и предполагая, что шаблоны (из File_2 ) могут иметь разное количество групп захвата … возможно, вы могли бы использовать комментарий Джонатана Леффлера, т. Е. Поместить все s/<search_pattern>/<replacement_pattern>/ команды в файл и просто передать указанный файл sed с -f опцией

Ответ №1:

Grep не подходит для обработки нескольких групп захвата. Не могли бы вы попробовать bash решение:

 #!/bin/bash

pat=$(<File_2)

while IFS= read -r line; do
    if [[ $line =~ $pat ]]; then
        printf "%st%st%st%sn" "$line" "${BASH_REMATCH[@]:1}"
    fi
done < File_1
 

Вывод:

 user_1  https://www.truecar.com/prices-new/honda/cr-v   truecar.com     honda   cr-v
user_2  https://www.truecar.com/prices-new/mazda/cx-5   truecar.com     mazda   cx-5
 

Ответ №2:

Использовать sed . Ваше регулярное выражение кажется расширенным регулярным выражением.

 sed -E 's/(truecar.com)/prices-new/([^/] )/([^/] )(.*)/amp; 1 2 3/'
 

Есть ли способ, которым я могу передать файл, содержащий все регулярные выражения, в sed?

Вы можете сгенерировать sed скрипт из содержимого file2. Сгенерируйте его … с sed помощью .

 sed -E "$(sed 's/.*/s@amp;@amp; \1 \2 \3@/' file2)"
 

Комментарии:

1. Как бы я обработал несколько шаблонов регулярных выражений в sed . Есть ли способ, которым я могу передать файл, содержащий все регулярные sed выражения?

2. @PhilCoulson: вы бы использовали несколько команд, либо с -e 'command1' -e 'command2' файлом, содержащим несколько команд, либо с файлом, содержащим несколько команд -f script.sed .

3. Извините, я все еще новичок. Как работает шаблон замены amp; 1 2 3 ?

4.grymoire.com/Unix/Sed.html#uh-3 grymoire.com/Unix/Sed.html#uh-8 gnu.org/software/sed/manual/sed.html#The-_0022s_0022-Command