Возьмите файл регулярных выражений и верните первое совпадение для каждого в другом файле.

351
Jacob Kopczynski

У меня есть два файла. a.txtимеет список регулярных выражений, разделенных символами новой строки. b.txtимеет строки, некоторые из которых соответствуют регулярным выражениям в a.txt.

Что я хочу: команда (grep, вероятно), которая будет принимать два файла, и для каждой строки a.txtпечатает первое совпадение всей строки из b.txt. Идеальным решением было бы также распечатать само регулярное выражение в качестве префикса и, если совпадений нет, вывести «нет совпадений» или что-то еще отличительное. Однако один из них отсутствует, или оба из них достаточно хороши.

Что я сейчас использую для тестирования решений:

a.txt:

[abc]*qs ab[cqs]* w+x+ 

b.txt:

aqs abqs abs 

Лучшие вещи, которые я пробовал grep -xf a.txt b.txt, какие, печатает

aqs abqs abs 

и grep -xcf a.txt b.txtкакие печатает 3.

Идеальный результат будет

[abc]*qs aqs ab[cqs]* abqs w+x+ None 

Минимально приемлемый результат будет

aqs abqs 
2

1 ответ на вопрос

1
Kamil Maciorowski
while read -r pattern; do printf '%s ' "$pattern" grep -x -m 1 "$pattern" b.txt || printf '%s\n' 'None' done <a.txt 

Он работает, читая шаблоны один за другим, выполняя grepдля каждого из них и печатая ( printf) дополнительную информацию, где это необходимо.

Примечание: grep -m 1останавливается после первого найденного совпадения, хотя это не POSIX. Если у вас нет этой опции, замените строку, содержащую grepэту:

{ grep -x "$pattern" b.txt || printf '%s\n' 'None'; } | head -n 1 

Похожие вопросы