【问题标题】:Sed and Awk Escaping Ampersands (&)Sed 和 Awk 转义 & 符号
【发布时间】:2013-06-18 23:13:25
【问题描述】:

我正在解析一个 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 不应该用于此的内容。我欢迎任何有关这方面的 cmets(通常如何生成文档?)。谢谢大家!

【问题讨论】:

  • $param 实际上包含什么?如果命令不是按顺序运行的(例如,如果中间实际上有一些其他代码),则不应将它们放在同一个代码块中,这会产生误导。
  • 抱歉误导部分。将来我会牢记这一点。 $param 包含一个参数元素。例如,如果有一个函数:function foo(&$arg1, $arg2) $param 应该是 '&$arg1' 不过好消息:我找到了一个修复程序。在执行 sed 之前,我确保转义任何 '&'。我在第一个参数分配之后添加了以下内容:param=$(echo $param | sed 's|^&|\\&|g') 这与尝试将内容包装在代码的 awk 部分相反。

标签: regex shell


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    您在问题中提到的the nawk manual 中记录了它:

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

    另外,您的 sub() 函数本质上是用 & 符号替换 & 符号。所以也许这就是为什么您认为即使使用两个反斜杠也无法正常工作的原因。

    【讨论】:

    • 将 sub 的输出发送到 sed 后是否有效?我认为 sub 正在输出一个文字 '&',但是当它传递给 sed 时,'&' 会再次被解释。所以对于 sub,我实际上是在尝试输出 '\&',以便它在 sed 部分中被转义。
    【解决方案3】:

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

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

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

    【讨论】:

    • 不幸的是,我认为这不是问题所在。将其替换为“&amp”仍将被 awk 和 sed 解释为正则表达式“&”,这会复制输出中的匹配项。 (我确实尝试了您的建议作为健全性检查。没有成功。)
    • 我在做一些测试后改变了答案。未转义的美元符号似乎是造成问题的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    相关资源
    最近更新 更多