URL编码Perl one liner中成功匹配的捕获值

时间:2012-08-30 12:19:56

标签: regex perl bash capture

我在bash脚本中使用以下Perl oneliner来捕获预标记之间的多行文本,并添加包含在不同的起始和结束字符串中的标记内容的第二次迭代:

new_start_string="NEWSTART"
new_end_string="NEWEND"

perl -i -pe  "BEGIN{undef $/;} s/<pre>(.*?)<\/pre>/<pre>\$1<\/pre>${new_start_string}\$1${new_end_string}/smg" /path/to/file

它完全适用于指定的任务。我知道我正在使用正则表达式解析HTML并且这并不理想,但是这个文本文件的格式是一个已知的因素,非常简单,在本地控制下并由本地规范完成,所以这是一个罕见的解析将是矫枉过正,我选择不通过解析来做到这一点。

使用相同的oneliner,我如何对捕获值$ 1变量的第二次迭代进行URL编码?如果不可能,是否有另一种方法可以获得相对简单和可读的结果?

2 个答案:

答案 0 :(得分:0)

对于URI转义,您可以使用URI::Encode。要在替换中使用函数,请参阅/e选项。

答案 1 :(得分:0)

因为我更喜欢在Perl核心中使用模块,所以我使用e修饰符结合CGI :: Util结束使用这个oneliner:

perl -MCGI -i -pe  "BEGIN{undef $/;} s/<pre>(.*?)<\/pre>/'<pre>' . \$1 . '<\/pre>' . '$new_start_string' . CGI::escape(\$1) . '$new_end_string'/esmg" /my/path