Трябва ли awk да разшири екраниращите последователности в присвоените от командния ред променливи?

Наскоро открих, че синтаксисът -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 е не низова константа и няма текст, който да показва, че се прилагат правилата за екраниране на низовата константа.

Моите въпроси:

  1. Има ли по-авторитетен източник за езика awk от man страницата и ако да, какво посочва той?
  2. Какво има да каже POSIX за това, ако има нещо?
  3. Всички версии на Awk ли се държат по този начин, т.е. мога ли да разчитам на извършеното разширение, ако наистина го искам?

person je4d    schedule 10.12.2012    source източник
comment
@shellter това не е изразът за печат, използвах printf %s, за да избегна това. За повече доказателства опитайте да използвате gsub или length, резултатите показват, че разширяването е направено преди стартирането на awk скрипта   -  person je4d    schedule 11.12.2012


Отговори (1)


Присвояването е низова константа.

Съответните раздели от стандарта са:

-v присвояване Приложението гарантира, че аргументът за присвояване е в същата форма като операнд за присвояване. Посоченото присвояване на променлива трябва да се случи преди изпълнението на програмата awk, включително действията, свързани с шаблони BEGIN (ако има такива). Могат да се посочат множество повторения на тази опция.

и

Операнд, който започва с долна черта или азбучен знак от преносимия набор от знаци (вижте таблицата в XBD преносим набор от знаци), последван от поредица от долни черти, цифри и азбучен знак от преносимия набор от знаци, последван от знака '=' , ще указва присвояване на променлива, а не пътека. Знаците преди '=' представляват името на awk променлива; ако това име е awk запазена дума (вижте Граматика), поведението е недефинирано. Знаците след ‹знака за равенство› трябва да се тълкуват така, сякаш са се появили в програмата awk, предшествани и следвани от символ с двойна кавичка ( ' )', като токен STRING (вижте Граматика), с изключение на това, че последният знак е неекраниран, той трябва да се тълкува като литерал, а не като първи знак от поредицата "\""

person William Pursell    schedule 10.12.2012