使用带负面预测的grep返回没有匹配项

时间:2018-05-03 09:06:02

标签: regex bash git grep

所以我正在编写一些用于将SVN迁移到GIT的脚本,我们有一堆" old" SVN中的分支仍然存在,但不需要转移到GIT。 (恰好已经合并到主干的分支)。 经过一段时间的谷歌,我想出了以下内容:

$(git for-each-ref --format='%(refname:short)' --merged origin/trunk | grep '(?!origin\/trunk)origin\/.*')

传递给

git branch -D --remote _previouscommandgoeshere_

如果我只运行git for-each-ref --format='%(refname:short)' --merged origin/trunk,我会得到以下输出:

origin/IR1091
origin/IR1102
origin/IR1105
...
origin/IR932
origin/Software
origin/trunk
origin/trunk@6792
origin/trunk@6850

当我添加grep命令时,我得到0值。

然而,https://regexr.com/3ot1t让我觉得我的正则表达式正是我想做的事情。删除除trunk分支以外的所有分支。

regexp / grep有什么问题? (注意我不是 linux / grep guru。这都是在windows git附带的bash中完成的)

1 个答案:

答案 0 :(得分:2)

正则表达式是正确的,但默认情况下grep不支持负面预测(?!等PCRE表达式构造。您需要启用-P标志以启用PCRE库,而不支持基本正则表达式引擎

.. | grep -oP '(?!origin\/trunk)origin\/.*'

或者在命令行上使用perl正则表达式匹配,不需要设置任何标记

.. | perl -ne 'print if /(?!origin\/trunk)origin\/.*/'