我在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编码?如果不可能,是否有另一种方法可以获得相对简单和可读的结果?
答案 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