我有这样的 git svn 命令:
git svn log --limit=1 --oneline
它将输出一行如下的内容:
r12345 | <anything, as it is svn comment inputted by svn-user>
我正在尝试通过管道输入 sed 命令以便获得12345
唯一的命令,但是我无法让它工作。有很多错误,当前的错误是parenthesis not balanced
我的最后一条命令如下:
git svn log --limit=1 --oneline | sed -e 's/r\(0-9) |*/\1/'
我已经在 Google 上搜索过了,但 sed 文档并不是很清楚...我不太擅长使用正则表达式,而我最好的经验是使用git --grep
具有良好文档的简化正则表达式。
如果重要的话,环境是 MacOSX 终端。
编辑:
sed -n 's/r\(0-9*\)/\1/
有效,但返回空字符串。
答案1
答案2
您快完成了
sed -e 's/r\([0-9]*\) .*/\1/'
你必须告诉 sed 你想要什么\([0-9]*\)
和不想要什么 / r
&.*/
答案3
我觉得sed
这甚至不是最好的工具,因为它是用于修改行的,但我认为这更像是一个提取问题。为此,使用带组的正则表达式是一种非常合理的方法。无论出于什么原因,grep
都无法提取组,我觉得这很奇怪。谢天谢地,pcregrep
它有。
pcregrep -o1 "^r([0-9]+)"
将匹配模式“r”后跟一些数字,仅在行首(这就是 的作用^
——否则,如果提交消息引用另一个提交,您可能会提取多个匹配项)。 用于-o1
提取第一组。示例:
$ echo "r12345 | <anything>" | pcregrep -o1 "^r([0-9]+)"
12345
为什么用这个而不是sed
?纯粹是为了简单。你只需要提取一些内容,所以可以使用纯正则表达式。我认为这比答案简单得多sed
。
答案4
另一种选择可能是: $ echo “r12345 | “| sed -n 's/^r\([0-9]*\).*$/\1/p' 12345 $_