2013-06-21 55 views
5

私はPHPファイルを解析し、関数プロトタイプ要素をHTMLでラップしています。しかし、アンパサンドがあると、コードが壊れます。SedとAwkエスケープアンパサンド(&)

入力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のに送り込ま、「\ &」、「\ &」にそれを処理するだろうと思ったので、は、私は3つのバックスラッシュを使用しました。私はどこからでも1から6のバックスラッシュを試しましたが、役に立たない。

質問: &からどのように私を逃すことができますか?

マニュアル:(質問のために必要ではない!!)私がやろうとしているものについてhttp://www.staff.science.uu.nl/~oostr102/docs/nawk/nawk_92.html


いくつかの "メタ" /デザイン質問
私はの束を持っています私が(Javadocsのように構造化した)少しのドキュメンテーションを生成しようとしているPHPファイル。私は、REGEXとシェルスクリプトを使って解析し、関数名、パラメータ、および返品項目を列挙します。これまでのところ、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

2つのバックスラッシュ(すなわち、sub(/^&/, "\\&", param))を使用すると、私にとって効果的です。それはあなたのために働かないのですか?それはあなたがあなたの質問に言及the nawk manualに記載されて

:いつものように

を、文字列に1つのバックスラッシュを挿入するために、あなたは、2つのバックスラッシュを記述する必要があります。したがって、また、交換

の「& `リテラルを含むように、文字列定数に」` \\ &を書き、あなたのsub()機能は、基本的にアンパサンドでアンパサンドを交換しています。だから多分2つのバックスラッシュでも動作しないと思うのです。

+0

subの出力をsedに送信した後に動作しましたか?私はサブがリテラル '&'を出力していると思うが、sedに渡されると '&'はもう一度解釈される。だからサブのために、私は実際に '\&'を出力しようとしているので、sed部分でエスケープされます。 – bobbyjoe93

0

sed方法:

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

が出力:

&$var1, &$var2 

またはHTMLコードが必要な場合は、txt2htmlのようなutilのにそれを渡す:

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