有条件的perl正则表达式替换

时间:2017-04-25 16:37:33

标签: regex perl

我尝试使用perl regex one-liner返回不同的替换结果(如果它与组匹配)。到目前为止,我已经得到了这个:

echo abcd |  perl -pe "s/(ab)(cd)?/defined($2)?\1\2:''/e"

但是我得到了

Backslash found where operator expected at -e line 1, near "1\"
(Missing operator before \?)
syntax error at -e line 1, near "1\"
Execution of -e aborted due to compilation errors.

如果输入为abcd我希望abcd输出,如果它是ab我想获得一个空字符串。我在哪里错了?

3 个答案:

答案 0 :(得分:4)

你在正则表达式模式之外使用正则表达式原子\1\2(匹配捕获的第一次或第二次捕获)。您打算使用$1$2(就像您在其他地方所做的那样)。

此外,双引号字符串中的美元符号对您的shell有意义。最好在你的程序 [1]

周围使用单引号
echo abcd | perl -pe's/(ab)(cd)?/defined($2)?$1.$2:""/e'

简单:

echo abcd | perl -pe's/ab(?!cd)//'
  1. 要么避免程序中的单引号 [2] ,要么使用'\''来“逃避”它们。
  2. 您通常可以使用q{}代替单引号。您也可以切换到使用双引号。在双引号内,您可以使用\x27作为撇号。

答案 1 :(得分:0)

为什么要折磨自己,只需使用分支重置。

查找(?|(abcd)|ab())
替换$1

答案 2 :(得分:0)

还有几种更好的方式

查找NextRow = Sheets("Heather").Range("A" & Rows.Count).End(xlUp).Row
替换abcd(*SKIP)(*FAIL)|ab

查找""
替换(?:abcd)*\Kab

明智地使用正则表达式 现在根本不需要使用 eval 形式
正则表达式替换构造""与define()的结合 使用perl命令行时尤其如此。

祝你好运......