【问题标题】:Perl: Repeat a pattern x times, where x is a match of \dPerl:重复模式 x 次,其中 x 是 \d 的匹配项
【发布时间】:2021-12-26 17:55:45
【问题描述】:

我已经匹配了一个特定的模式,另外还有一个数字通过

perl -pe 's/\(pattern\)(\d)/ ... /'

我知道我可以通过将 $1 放在 ... 所在的位置和使用 $2 的数字来访问该模式。我现在如何在 ... 所在的位置重复模式 $2 次? 更具体地说,我有这样的表达:

perl -pe 'while(s/Power\(((?:(?!Power\().)+?),2\)/(($1)*($1))/){}' file.txt

我想将其概括为不仅匹配 2,它在其中被硬编码为重复 $1 两次,而且匹配任何数字 n 并重复 $1 n 次。所有这些仍应在 oneliner 中完成。

例如,将脚本调用到表达式上

Power(Power(x,3),2)

应该返回

(((x)*(x)*(x))*((x)*(x)*(x)))

【问题讨论】:

  • 为什么一定要单线?
  • 输入/输出的几个例子会有帮助。
  • @stark 从技术上讲它不需要,但对我来说实现到我现有的脚本中是最容易的。 @Dada 我会在原问题上补充一些

标签: regex perl replace


【解决方案1】:

你可以使用

perl -pe 'while(s/Power\(((?:(?!Power\().)+?),(\d+)\)/"((". $1 . ")" . ("*(" . $1 . ")") x ($2-1) . ")"/e){}' file.txt

查看在线演示:

#!/bin/bash
s='Power(25,2)  Power(225,4)'
perl -pe 'while(s/Power\(((?:(?!Power\().)+?),(\d+)\)/"((". $1 . ")" . ("*(" . $1 . ")") x ($2-1) . ")"/e){}' <<< "$s"
# => ((25)*(25))  ((225)*(225)*(225)*(225))

/e 标志将 RHS 视为表达式,替换是动态构建的,并且在 x operator 的帮助下进行重复。请注意,重复量等于捕获到第 2 组的数量减去1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多