#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!