【问题标题】:URL encode value of capture from successful match in Perl oneliner在 Perl oneliner 中成功匹配捕获的 URL 编码值
【发布时间】:2012-08-30 12:19:55
【问题描述】:

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

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 编码?如果不可能,有没有另一种方法可以得到这个结果,也比较简单易读?

【问题讨论】:

  • 您可以使用/e 修饰符并将您喜欢的任何代码放在替换部分中。

标签: regex perl bash capture


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    因为我更喜欢在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      相关资源
      最近更新 更多