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