2017-04-02 93 views
2

首先,對潛在的重複問題表示歉意。我是bash腳本新手,我甚至無法找出一些要搜索的關鍵字。隨着中說,我試圖像我一樣可以簡化問題描述:Awk,gsub,&符號和意外擴展

我有一個文本文件(test.txt的)只包含此行:

REPLACE 

我跑到下面的命令是應該用代碼變量值if (A & B)替換文件的文本(即REPLACE)。

code="if (A & B)" ; awk -v var="${code}" '{ gsub(/REPLACE/, var); print }' test.txt 

預期輸出我期望要打印code變量值是:

if (A & B) 

實際輸出某種方式與符號擴展成 'REPLACE',這是gsub的regexp參數:

if (A REPLACE B) 

也許我需要逃避放大器ersand,但不幸的是,code變量人口超出了我的控制範圍,所以我無法手動操作它的值。

FYI awk的版本是 「GNU awk中4.1.4 API:1.1(GNU MPFR 3.1.5,GNU MP 6.1.2)」

謝謝!

+1

'&'的意思是「代替完全匹配「在awk正則表達式中,包括gsub。你需要轉義它:'code =「if(A \\&B)」'(是的,有兩個baclslashes,因爲shell也在擴展它) – grochmal

回答

2

&是許多工具中的反向引用元字符,它表示「匹配您搜索的正則表達式的字符串」。如果您嘗試使用文字字符串,則使用文字字符串而不是正則表達式和反向引用。

如:

code="if (A & B)" 
awk -v old="REPLACE" -v new="$code" 's=index($0,old){$0=substr($0,1,s-1) new substr($0,s+length(old))} 1' test.txt 

替代,試圖santize正則表達式和替換,複雜,容易出錯,一般不爲微弱的心臟,請參閱:Is it possible to escape regex metacharacters reliably with sed

+1

謝謝Ed!你提供的例子完美地工作。 – Remon

+1

哈!無需等待。感謝您的提醒;) – Remon

+1

嗨Ed,這段代碼幫了我很多,我有麻煩在awk中使用gsub實現模板引擎,因爲&符號。我希望有一種方法可以禁用它。但是你的解決方案像夢一樣工作。謝謝! – valrog