2013-06-21 64 views
5

我正在解析一個PHP文件並在HTML中包裝函數原型元素。如果有&符號,它會破壞我的代碼。Sed和Awk Escaping&符號(&)

輸入function foo (&$var1, &$var2){...} //爲字符串
所需的輸出(在HTML)&$var1, &$var2//基本上,只輸出變量,使他們正確地顯示在瀏覽器

眼下,我發送每個變量到awk的子方法,然後sed。

sub(/^&/, "\\\&", param) #param is the variable of interest (e.g. &$var1) 

#Intermediate step in case it's relevant. The awk-processed elements 
#are sent to ${file}_param.txt. Each set of parameters are delimited by colons. 
param=$(cut -d: -f$counter ${file}_param.txt) 

#Replace some default text in template file with real stuff. 
sed -i "s|@PARAM|$param|1" "$base"_funct_def.txt 

輸出我得到:的&符號被解釋。整場比賽被取代。

問題的隔離:按照我的意思,在瀏覽器中顯示'g $ var1'。但是,我試圖獲得'&'。

sub(/^&/, "g", param) 

我嘗試:我用三個反斜槓,因爲我認爲AWK會先處理成「\ &」其中,送入sed的,將其解釋「\ &」爲文本「&」。儘管我嘗試了從1到6個反斜槓,但無濟於事。

問題:如何逃生&?

手冊:http://www.staff.science.uu.nl/~oostr102/docs/nawk/nawk_92.html


一些 「元」/設計什麼我想要做的(不需要的問題!!)
我有一大堆的問題PHP文件,我想生成一些文檔(像Javadocs結構)。我正在使用REGEX和shell腳本來解析它,以便列出函數名稱,參數和返回項目。到目前爲止,我認爲REGEX工作得很好,但我已經閱讀了很多有關REGEX不應該用於的東西。我歡迎任何有關這方面的評論(文檔通常如何生成?)。多謝你們!

+0

這是什麼'$ param'其實包含?如果這些命令沒有按順序運行(例如,如果實際上有其他代碼),則不應將它們放在同一代碼塊中,這會造成誤導。 – doubleDown

+0

對錯誤部分抱歉。我將來會記住這一點。 $ param包含一個參數元素。例如,如果有一個函數: 'function foo(&$ arg1,$ arg2)' $ param應該是''&$ arg1'' 雖然好消息:我找到了一個修復程序。在執行sed之前,我確保轉義任何'&'。我在第一個參數賦值之後添加了以下內容: 'param = $(echo $ param | sed's | ^&| \\&| g')' 這與將事情包裝在awk部分代碼。 – bobbyjoe93

回答

0

我相信HTML讀取&作爲&字符。在你的awk腳本,你可以使用:

sub(/^&/, "&", param) 

param美元符號需要用反斜槓,例如進行轉義& $ var需要寫成& \ $ var,否則sed和awk會嘗試將$ var作爲變量擴展。

+1

不幸的是,我不認爲這是問題。用「&amp」替代它仍然會被awk和sed解釋爲REGEX'&',它會複製輸出中匹配的項目。 (我嘗試了你的建議,只是作爲一個完整的檢查,沒有解決。) – bobbyjoe93

+0

在做了一些測試之後,我改變了我的答案。未擺脫的美元跡象似乎是造成這個問題的原因。 – gbrener

0

使用兩個反斜槓(即sub(/^&/, "\\&", param))適用於我。它不適合你嗎?

據記載在the nawk manual你在你的問題中提及:

像往常一樣,插入一個反斜槓在字符串中,你必須寫兩個反斜槓。因此,「在一個字符串常量,包括文字上的`&」寫'\\ &在更換

此外,您sub()功能基本上替換與符號符號。所以也許這就是爲什麼你認爲即使使用兩個反斜槓也不行。

+0

將sub的輸出發送給sed後是否有效?我認爲sub輸出一個文字'&',但是當它傳遞給sed時,'&'會再次被解釋。所以對於sub,我實際上是試圖輸出'\&',以便它在sed部分中被轉義。 – bobbyjoe93

0

sed方法:

printf "%s\n" 'function foo (&$var1, &$var2){...}//as String' | 
sed -n '/function/{s/^.*(//;s/).*$//;p}' 

輸出:

&$var1, &$var2 

或者,如果需要的HTML代碼,它傳遞給像txt2html一個實用程序:

printf "%s\n" 'function foo (&$var1, &$var2){...}//as String' | 
sed -n '/function/{s/^.*(//;s/).*$//;p}' | txt2html