Переменные оболочки в match () с регулярным выражением даты - PullRequest
0 голосов
/ 11 июля 2019

В сценарии оболочки у меня есть пара переменных:

last_month=$(date +%m -d "-1 month")
year=$(date +%Y -d "-1 month")

То, что третье поле (дата) в файле (с использованием "|" в качестве разделителя) должно совпадать:

awk -v awk_last_month="$last_month" -v awk_year="$year" -i inplace 'BEGIN {FS=OFS="|"} match($3,/^[0-9]+\/awk_last_month\/awk_year/)' "$export_name"

Я уверен, что в поле (много!) Совпадают строки, и я провел несколько тестов, чтобы заставить AWK распечатать переданные переменные (awk_last_month и awk_year): он печатает их, но когда они используются внутриmatch () сопоставление не удается, и я получаю пустой файл.Я думал, что это как-то связано с косой чертой даты (https://unix.stackexchange.com/questions/120788/pass-shell-variable-as-a-pattern-to-awk),, но согласно приведенному выше коду они экранированы.

1 Ответ

2 голосов
/ 11 июля 2019

Материал между слешами - это буквальное регулярное выражение без доступа к переменным;но вторым аргументом match() может быть строка, в которую вы можете интерполировать переменные с помощью обычных механизмов Awk - то есть

match($3, "^[0-9]+\/" awk_last_month "\/" awk_year)

или

match($3, sprintf("^[0-9]+\\/%s\\/%s", awk_last_month, awk_year))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...