Минимальный пример:
$ 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)