Sed和Awk Escaping Ampersands(&)

时间:2013-06-21 18:10:56

标签: regex shell

我正在解析PHP文件并用HTML包装函数原型元素。但是,如果有&符号,则会破坏我的代码。

输入function foo (&$var1, &$var2){...} //作为字符串
所需的输出(以HTML格式)&$var1, &$var2 //基本上,只输出变量以便在浏览器中正确显示

现在,我将每个变量发送到awk的子方法 1 ,然后发送到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个反斜杠,但无济于事。

问题:如何逃避&?

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


关于我正在尝试做什么的一些“元”/设计问题(问题不需要!!)
我有一堆PHP文件,我正在尝试生成一些文档(结构像Javadocs)。我正在使用REGEX和shell脚本进行解析,以便列出函数名称,参数和返回项目。到目前为止,我认为REGEX已经很好地完成了,但我已经阅读了很多关于这是如何不应该使用REGEX的内容。我欢迎任何有关此问题的评论(通常如何生成文档?)。谢谢你们!

3 个答案:

答案 0 :(得分:0)

我相信HTML会将&作为&符号。在您的awk脚本中,您可以使用:

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

param中的美元符号需要使用反斜杠进行转义,例如& $ var需要写成& \ $ var,否则sed和awk会尝试将$ var扩展为变量。

答案 1 :(得分:0)

使用两个反斜杠(即sub(/^&/, "\\&", param))对我有用。它不适合你吗?

您在问题中提到的the nawk manual中记录了这一点:

  

像往常一样,要在字符串中插入一个反斜杠,必须编写两个反斜杠。因此,写'\\&'在一个字符串常量中包含一个文字`&'在替换

此外,您的sub()功能实际上是用&符代替&符号。所以也许这就是为什么你认为即使有两个反斜杠它也不起作用。

答案 2 :(得分: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