Это взято из "упражнений".
Для входного файлаpatterns.txt отфильтруйте строки, содержащие три или более вхождения «ar» и замените предпоследний «ar» на «X»
пар автомобиль смола далеко тележка
часть тележки магазин
Ожидаемый результат
номинальная машина TX Far Cart
PXT тележка магазин
awk 'BEGIN{r = @/(.*)ar((.*ar){2})/} $0~r{print gensub(r, "\\1X\\2", 1)}' patterns.txt
Есть одна мысль, которую я не могу понять. Что означает «@» в блоке BEGIN?
Это похоже на способ сохранить регулярное выражение в переменной.
@mr.Nobody: где ты нашел "awk-упражнения"? Спасибо
Стоит отметить, что gensub
— это расширение gawk
(реализация языка программирования AWK, разработанное проектом GNU), которого нет в POSIX awk.
@shellter кажется из этого
Немного предыстории: стандартные константы регулярных выражений.
Без префикса @
:
##### this:
r = /(.*)ar((.*ar){2})/
##### is comparable to this:
r = ($0 ~ /(.*)ar((.*ar){2})/) # assign 'r' the value of the comparison, ie, r = 0 (false) or 1 (true)
ПРИМЕЧАНИЕ: если r = /(.*)ar((.*ar){2})/
выполняется в блоке BEGIN
(где $0
не определено), вы всегда получите r = 0 (false)
Очевидная цель этой строки кода — назначить шаблон регулярного выражения переменной r
для дальнейшего использования в скрипте.
В GNU awk
есть несколько подходов к присвоению шаблона регулярного выражения переменной:
r = "(.*)ar((.*ar){2})"
r = @/(.*)ar((.*ar){2})/
Итак, чтобы ответить на вопрос ОП, r = @/.../
— это один из подходов (строготипизированная константа регулярного выражения), доступный в GNU awk
для присвоения регулярного выражения переменной.
@dawg Это не похоже на объяснение. Он не вызывает это как функцию.