我尝试使用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
我想获得一个空字符串。我在哪里错了?
答案 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)//'
'\''
来“逃避”它们。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命令行时尤其如此。