2

У меня есть два файла. 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

1 ответ1

1
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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .