使用 sed 检索行的一部分

使用 sed 检索行的一部分

我有这样的 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

这是一个无正则表达式的解决方案,因为

有些人在遇到问题时会想“我知道,我会使用正则表达式。” 现在他们有两个问题。

(对此持保留态度)

您可以使用cut两次:

git svn log --limit=1 --oneline | cut -d ' ' -f 1 | cut -c 2-

第一个剪切 ( cut -d ' ' -f 1) 将空格设置为列分隔符并仅选择第一列,因此r12345。第二个剪切 ( cut -c 2-) 选择位置 2 及之后的字符 ( 2-)。

答案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
$_

相关内容