我正在使用 git 过滤器分支来完成一项特定任务。它使用 sed 命令。当我使用简单的正则表达式时,一切正常,但对于更复杂的东西则不然。也许我在正则表达式或转义字符中有错误。请帮忙。
git filter-branch -f --msg-filter 'sed -e "s/\[PEM-2233\] Merge branch 'master' of https:\/\/bitbucket\.test\.domain\.com\/rrr\/pem\/hello-world into feature\/PEM-2233-do-acceptance-tests/CHANGED/"' -- --all
我试图捕捉的提交消息是
[PEM-2233] Merge branch 'master' of https://bitbucket.test.domain.com/rrr/pem/hello-world into feature/PEM-2233-do-acceptance-tests
答案1
问题在于 周围的单引号'master'
。这些引号中的第一个将结束以 开头的单引号字符串sed -e
。报价本身不会传递给sed
.
这相当于问题
$ echo '"hello 'user'"'
"hello user"
将引用更改为
'\'master\''
(该字符串'master'
将被 shell 视为不带引号的字符串),或者'"'master'"'
(该字符串'master'
将被 shell 视为双引号字符串)。
另外,为了避免牙签倾斜综合症,为命令使用另一个分隔符s
:
s#...#...#
答案2
不能嵌套单引号。前面的单引号master
关闭后面开始的带引号的字符串--msg-filter
。
由于不能在单引号字符串中包含单引号,因此需要结束字符串并正确转义引号:
branch '\'master\'' of http