awk: warning: escape-последовательность `\ / 'рассматривается как обычная ошибка` /' при запуске команд в терминале Mac OSX - PullRequest
0 голосов
/ 28 октября 2018

В настоящее время я прорабатываю код, предназначенный для системы Linux (я использую Mac), и пытаюсь запустить эту строку awk:

awk -F"[:,}][^:\/\/]" '{for(i=1;i<=NF;i++){if($i~/\042'$KEY'\042/)
{print $(i+1)}}}' | tr -d '"' | sed -n ${num}p | sed -e 
's/^[[:space:]]*//' -e 's/[[:space:]]*$//' -e 's/[,]*$//'

возвращает следующую ошибку:

awk: warning: escape sequence `\/' treated as plain `/'.

Я понимаю, что некоторые реализации и синтаксис отличаются от Mac и Linux.Может ли эта ошибка быть одной из них?спасибо.

1 Ответ

0 голосов
/ 28 октября 2018

Минимальный пример:

$ awk -F"[:,}][^:\/\/]" '1' /dev/null
awk: warning: escape sequence `\/' treated as plain `/'

Исправление:

$ awk -F'[:,}][^://]' '1' /dev/null
$

т.е. нет причин избегать косых черт в динамическом регулярном выражении.Вы должны избегать их в литерале регулярного выражения (например, /foo\/bar/), потому что они являются разделителем регулярного выражения, а не потому, что они являются мета-символами регулярного выражения, и поэтому это не относится к динамическому регулярному выражению (то есть, которое хранится в строке и т. Д.).ограничены разделителями строк, а не разделителями регулярных выражений).Я также исправил ваши кавычки.

Обратите внимание, что повторение одного и того же символа (например, /) в выражении в скобках бесполезно.[/] - это точно такой же набор символов, что и [//] или [///////].

Если вам действительно нужно было экранировать /, тогда это будет:

$ awk -F'[:,}][^:\\/]' '1' /dev/null
$

и если вы использовали неправильные кавычки, как в исходном коде:

$ awk -F"[:,}][^:\\\/]" '1' /dev/null
$

В строке ' -delimited необходимо 2 экранирования, потому что awk должен сначала преобразовать строку в регулярное выражение (проход синтаксического анализа1) перед его использованием в качестве регулярного выражения (этап 2).

В строке " необходимо 3 экранирования, потому что в этом случае вы специально указываете оболочке анализировать строку, чтобы она имеласначала проанализировать его (проход 1) перед передачей в awk, а затем awk должен преобразовать строку в регулярное выражение (проход 2), прежде чем использовать ее в качестве регулярного выражения (проход 3).

между прочимскрипт неправильно использует переменные оболочкиЭто:

awk -F'[:,}][^:/]' '{for(i=1;i<=NF;i++){if($i~/\042'$KEY'\042/)

Если бы можно было разрешить расширению переменной оболочки стать частью текста скрипта awk (а это не так), она будет записана как:

awk -F'[:,}][^:/]' '{for(i=1;i<=NF;i++){if($i~/\042'"$KEY"'\042/)

, ноправильный способ сделать это:

awk -F'[:,}][^:/]' -k key="$KEY" '{for(i=1;i<=NF;i++){if($i~"\042"key"\042")

или предпочтительно:

awk -F'[:,}][^:/]' -k key="\"$KEY\"" '{for(i=1;i<=NF;i++){if($i~key)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...