программное создание регулярных выражений с помощью sed для использования в gawk

#bash #awk #sed

#bash #awk #sed

Вопрос:

Я пытаюсь создать большое регулярное выражение из множества параметров в файле, которое будет использоваться gawk . Цель состоит в том, чтобы найти совпадения в lines.txt которые соответствуют ЛЮБОМУ из вариантов в regex.txt

Файл строк для поиска

 echo -n "dog
cat
bobcat" > lines.txt
  

Файл регулярных выражений, которые будут объединены в большое регулярное выражение

 echo -n "dog
cat" > regex.txt
  

Я знаю структуру того, что я пытаюсь сделать, но когда я использую sed для вставки позиционных совпадающих символов в регулярное выражение, я получаю | завершение.

Это то, что у меня сейчас есть

 rgx=$(cat "regex.txt" | sed 's#^#\\<#' | tr 'n' '|')


gawk -v regex=$rgx 'BEGIN {IGNORECASE = 1} {print gsub(regex,"")}' lines.txt
  

Текущий вывод из gawk

 1
1
7
  

Желаемый результат gawk

 1
1
0
  

Пожалуйста, помогите

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

1. Какая версия gawk у вас есть? получаем 1 1 0, как и ожидалось. Но реальный вопрос — зачем вы это делаете? Какую проблему вы пытаетесь решить?

2. Если вы добавите новую строку в конец regex.txt (ваш пример с cat приведенным выше не будет), вы получите 1 1 7 вместо 1 1 0 (где новые строки — это пробелы). Не могу вам больше помочь, поскольку я понятия не имею, чего вы пытаетесь достичь здесь.

3. вы можете попробовать удалить последнее | , добавив sed 's#|$##' после tr 'n' '|'

Ответ №1:

Нет смысла также использовать sed, когда вы используете awk. Похоже, вы хотите что-то вроде:

 gawk '
    BEGIN { IGNORECASE = 1 } 
    NR == FNR {
        regex = (NR>1 ? regex "|" : "") "\<" $0 "\>"
        next
    }
    { print gsub(regex,"") }
' regex.txt lines.txt
1
1
0
  

Ответ №2:

Комментарий @Stef приводит меня к желаемому результату.

Мой sed вставлял новую строку в конце, которая заменялась на | , и это вызывало неожиданное поведение.

Итак, рабочее регулярное выражение rgx=$(cat "regex.txt" | sed 's#^#\\<#' | tr 'n' '|' | sed 's#|$##')

Но, как показывает принятый ответ Эда Мортона, это можно сделать более элегантно, используя только gawk . Мне явно нужно больше узнать о awk!