与sed的最小匹配

与sed的最小匹配,sed,Sed,我正在为git制作一个解析器,它允许包含[的分支名称和同时包含[]的注释。因此,我需要在[的第一个实例和后面的]之间提取跟踪信息 以下是我尝试使用的: sed -rn "s/^\*\ [^\[]*\[([^\]]*)\].*$/\1/p"; 你们中的一些人会知道,^\*\匹配是针对当前分支的。然后,在捕获]之前,我尝试匹配除[之外的所有内容。不幸的是,匹配似乎与我的第一个子句没有什么不同,那是一个简单的*\[(.*)\].*$.任何包含成对方括号的提交都会使我的脚本变得疯狂 我可以通过输入以下

我正在为git制作一个解析器,它允许包含
[
的分支名称和同时包含
[]
的注释。因此,我需要在
[
的第一个实例和后面的
]
之间提取跟踪信息

以下是我尝试使用的:

sed -rn "s/^\*\ [^\[]*\[([^\]]*)\].*$/\1/p";
你们中的一些人会知道,
^\*\
匹配是针对当前分支的。然后,在捕获
]之前,我尝试匹配除
[
之外的所有内容。
不幸的是,匹配似乎与我的第一个子句没有什么不同,那是一个简单的
*\[(.*)\].*$.
任何包含成对方括号的提交都会使我的脚本变得疯狂

我可以通过输入以下内容故意违反我的条款:

* haha 2b35744 [twodeep: ahead 1] Bad comments contain hashes followed by brackets... bad2bad [].
请注意,sed匹配在第二对方括号之间。我想匹配
twodeep:ahead 1
,但我的子句返回一个空字符串(第二对方括号之间的匹配)。我觉得这可能是awk的情况。

尝试以下操作:

$ sed -rn 's/^\*[^[]*\[([^]]*).*/\1/p' <<< "* haha 2b35744 [twodeep: ahead 1] Bad comments contain hashes followed by brackets... bad2bad []."
twodeep: ahead 1

$sed-rn的/^\*[^[]*\[([^]]*)./\1/p'如果这不是您所需要的全部:

$ sed 's/[^[]*.\([^]]*\).*/\1/' file
twodeep: ahead 1

然后编辑您的问题,以提供更具代表性的示例输入/输出和更清晰的描述。

以下是适用于此应用程序的内容:

git branch -vv | sed -rn 's/^\*\ (.*)$/\1/p' | awk -F\[ '{print $2}' | awk -F\] '{print $1}'
这将匹配活动分支,并解析第一个打开方括号和下一个关闭方括号之间的位。分支名称允许包含关闭方括号。sed本身似乎与行中字符的最后一个实例匹配。使用awk比单独使用sed更可靠。

使用:


前面/后面的摸索可以浓缩。但这需要比复制和粘贴更大的努力;何必麻烦呢。此外,六个月后代码可能更难理解。

不要在评论中添加额外的信息。编辑您的问题。另外,假设您的读者不知道git分支名称的样子。只需列出有效的输入和您期望的结果。您列出的输入是否碰巧在git中有任何意义完全不是您的问题的重点。请保持文明和建设性的评论早上好,Jon。看起来您正在尝试解析
git branch-vvv
或类似的输出。您可能会在git的“管道”命令。如果是这样,您可能想查看或询问有关使用Git管道命令生成类似于
Git branch
的输出的问题,但更适合您自己的用途(无论它们是什么)。同时,由于这是一个关于sed的问题,它看起来像是[Git]标签应该被删除…这就是我正在做的,torek。我不熟悉git管道。标签似乎适合这个问题,尽管这是我在这个网站上问过的第一个问题,所以我对它的操作完全不熟悉。贪婪匹配仍然在捕获第二对括号之间的空字符串。哦,甚至如果第二个括号之间有什么东西,我仍然希望匹配第一对。除了您未能在捕获的字符串中分隔右大括号之外,这与我在问题中提供的匹配语句有何不同?它不同于您不应转义
[
]
在字符范围内,正如您在
[^\[]
[^\]]*
中所做的那样。这就是您的输出为空的原因。如果您不转义方括号,则正则表达式解析将捕捉它们作为特殊字符。您的“答案”肯定不是。您不能转义
[
]
在字符列表中,只需将它们放在列表的开头。请参阅。我今天必须对此进行更多的修改。虽然我倾向于使用sed的-r选项,但您的匹配似乎有效。我使用此表达式匹配git存储库中活动分支的跟踪部分,如“git branch-vv”返回的。不知道git内容b但是,如果你可以把它放在一边,只讨论一下输入和输出命令的文本,那么我很乐意提供帮助。不要使用
-r
启用带有sed的ERE,顺便说一句,因为这是GNU-sed特定的。相反,使用
-E
,它将在GNU-sed和其他变体中工作。在这种情况下,这两者都不是必需的,因为BRE是你所需要的。你如果您使用的是awk,那么就不需要sed,因为您将要使用的awk肯定不会是这样,而且到目前为止发布的解决方案完全符合您的要求,因此将这些解决方案放到一边并发布您自己的解决方案是非常不礼貌的,因为这些解决方案可能会做一些您在示例输入/输出中没有演示的事情。 $ git branch -vvv | txr gitbranchvvv.txr - | head NAME UPSTREAM AHEAD BEHIND MSG MAKEFRESH 0 0 Implementing finalization hooks. alloca master 0 1195 Detect alloca. awk-uwr-feature-branch 0 0 WIP chk-manage-vec-branch 0 0 Use chk_manage_vec for static slots arrays. cirqual 0 0 WIP curl 0 0 Curl: WIP debugger-improvements 1 0 WIP del-indices-branch master 8 882 WIP dict-branch master 0 1224 WIP
@(collect)
@  (cases)
  @name @hash [@upstream: ahead @ah, behind @bh] @msg
@  (or)
  @name @hash [@upstream: ahead @ah] @msg
@  (or)
  @name @hash [@upstream: behind @bh] @msg
@  (or)
  @name @hash [@upstream] @msg
@  (or)
  @name @hash @msg
@  (bind upstream nil)
@  (end)
@  (maybe)
@    (bind (ah bh) (0 0))
@  (end)
@(end)
@(output)
NAME                           UPSTREAM            AHEAD   BEHIND MSG
@  (repeat)
@{name                      30} @{upstream  16} @{ah -8} @{bh -8} @msg
@  (end)
@(end)