передать шаблон регулярного выражения bash как часть большего шаблона регулярного выражения в awk - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь сделать это в моем сценарии:

 CONTEXT_PAT1="\[[gG][lL][oO][bB][aA][lL]\]"

 awk -v pat1="$CONTEXT_PAT1" 'f;/^[:space:]*pat1[:space:]*$/{f=1}' ${CONFIG_FL}

Когда я запускаю его в режиме отладки, я вижу, что это происходит:

 ++ awk -v 'pat1=\[[gG][lL][oO][bB][aA][lL]\]' 'f;/^[:space:]*pat1[:space:]*$/{f=1}

Ожидается:

 ++ awk -v 'pat1=\[[gG][lL][oO][bB][aA][lL]\]' 'f;/^[:space:]\[[gG][lL][oO][bB][aA][lL]\][:space:]*$/{f=1}

Как мне этого добиться?Я просмотрел некоторые статьи здесь в stackoverflow

https://unix.stackexchange.com/questions/120788/pass-shell-variable-as-a-pattern-to-awk?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

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

Как этого добиться?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

В действительности вы МОЖЕТЕ сопоставить переменную или функцию.Это только неявное сокращение, где RE предназначено для соответствия всей строке, где нет механизма для встраивания переменной в большее RE.Таким образом, вы можете захотеть быть EXplicit и использовать оператор RE, ~.

. Для вашего примера я бы выбрал что-то вроде этого:

$ pat1="[[][gG][lL][oO][bB][aA][lL][]]"
$ awk -v pat1="$pat1" 'BEGIN{re="^[[:space:]]*" pat1 "[[:space:]]*$"} f; $0~re{f=1}' file.cfg

Или даже,

$ awk -v pat1="$pat1" 'f; $0~sprintf("^[[:space:]]*%s[[:space:]]*$",pat1) {f=1}' file.cfg

Я мог бы даже еще больше упростить использование этой вещи, избавив вас от хлопот, связанных с передачей без учета регистра:

$ pat1="global"
$ awk -v pat1="$pat1" 'f; tolower($0) ~ sprintf("^[[:space:]]*[[]%s[]][[:space:]]*$",tolower(pat1)) {f=1}' file.cfg
0 голосов
/ 31 мая 2018

Edit: чтобы получить вывод, который вы ожидаете от вашего sh -x следа, прочитайте этот ответ.Чтобы создать правильный awk-код, прочитайте ответ @ ghoti.

$ раскрытие не происходит в одинарных кавычках ('), а в двойных кавычках ".Попробуйте:

CONTEXT_PAT1="\[[gG][lL][oO][bB][aA][lL]\]"

awk 'f;/^[:space:]'"${CONTEXT_PAT1}"'[:space:]*$/{f=1}' "${CONFIG_FL}"

Оболочка не будет расширяться * pat1 для вас.Предполагая, что вы подразумеваете под "режимом отладки", это sh -x

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