Недавно я обнаружил, что синтаксис Awk -v VAR=VAL
для инициализации переменных в командной строке расширяет escape-последовательности в VAL. Раньше я думал, что это хороший способ передать строки в Awk без необходимости сначала запускать над ними функцию экранирования.
Например, следующий скрипт:
awk -v VAR='x\tx' 'BEGIN{printf("%s\n", VAR);}'
я рассчитывал напечатать
x\tx
но на самом деле печатает:
x x
В стороне: переменные среды для передачи строк в неизмененном виде, этот вопрос не спрашивает, как получить поведение, которое я ожидал ранее.
Вот что справочная страница говорит по этому поводу:
-v var=val, --assign var=val Присвоить значение val переменной var перед началом выполнения программы. Такие значения переменных доступны в блоке BEGIN программы AWK.
И еще ниже:
Строковые константы Строковые константы в AWK – это последовательности символов, заключенные в двойные кавычки (например, "значение"). Внутри строк распознаются определенные escape-последовательности, как в C. Это:
... список управляющих последовательностей ...
Управляющие последовательности также могут использоваться внутри постоянных регулярных выражений (например, /[ \t\f\n\r\v]/ соответствует пробельным символам).
В режиме совместимости символы, представленные восьмеричными и шестнадцатеричными управляющими последовательностями, обрабатываются буквально при использовании в константах регулярных выражений. Таким образом, /a\52b/ эквивалентно /a*b/.
Насколько я понимаю, val
в -v var=val
не является строковой константой, и нет текста, указывающего, что применяются правила экранирования строковых констант.
Мои вопросы:
- Есть ли более авторитетный источник языка awk, чем справочная страница, и если да, то что в нем указано?
- Что POSIX может сказать по этому поводу?
- Все ли версии Awk ведут себя таким образом, т. е. могу ли я полагаться на выполнение расширения, если я действительно этого хочу?
printf %s
, чтобы избежать этого. Для получения дополнительных доказательств попробуйте использоватьgsub
илиlength
, результаты показывают, что расширение выполняется до запуска сценария awk. - person je4d   schedule 11.12.2012