#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 строками / шаблонами; ответ, основанный на предположении об одном шаблоне (fromFile_2
), будет (относительно) простым ответом по сравнению с ответом, основанным на нескольких шаблонах (fromFile_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