[英]Should awk expand escape sequences in command-line assigned variables?
我最近發現,用於在命令行初始化變量的Awk的-v VAR=VAL
語法擴展了VAL中的轉義序列。 我之前認為這是一種將字符串傳遞給Awk而不需要首先對它們運行轉義函數的好方法。
例如,以下腳本:
awk -v VAR='x\tx' 'BEGIN{printf("%s\n", VAR);}'
我希望打印
x\tx
但實際打印:
x x
另外:環境變量以未經修改的方式傳遞字符串,這個問題不是詢問如何獲得我之前預期的行為。
以下是該手冊頁有關此事的內容:
-v var = val ,-- assign var = val在程序開始執行之前,將值val賦給變量var。 這些變量值可用於AWK程序的BEGIN塊。
進一步向下:
字符串常量 AWK中的字符串常量是用雙引號括起來的字符序列(如“value”)。 在字符串中,可識別某些轉義序列,如C中所示。這些是:
...逃脫序列列表......
轉義序列也可以在常量正則表達式中使用(例如,/ [\\ t \\ f \\ n \\ r \\ t] /匹配空格字符)。
在兼容模式下,八進制和十六進制轉義序列表示的字符在正則表達式常量中使用時將按字面處理。 因此,/ a \\ 52b /等於/ a * b /。
我讀這個的方式, val
in -v var=val
不是字符串常量,並且沒有文本表明字符串常量轉義規則適用。
我的問題:
賦值是一個字符串常量。
標准的相關部分是:
-v賦值應用程序應確保賦值參數與賦值操作數的形式相同。 指定的變量賦值應在執行awk程序之前發生,包括與BEGIN模式相關的操作(如果有的話)。 可以指定多次出現此選項。
和
一個操作數,以便攜式字符集中的下划線或字母字符開頭(參見XBD可移植字符集中的表),后跟可移植字符集中的下划線,數字和字母序列,后跟'='字符,應指定變量賦值而不是路徑名。 '='前面的字符代表awk變量的名稱; 如果該名稱是awk保留字(請參閱語法),則行為未定義。 <equals-sign>后面的字符應被解釋為好像它們出現在awk程序之前和之后是雙引號(')'字符,作為STRING標記(參見語法),除非最后一個字符是如果沒有轉義,則應將其解釋為字面而不是序列“\\”的第一個字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.