与sed

时间:2016-10-23 08:30:02

标签: sed

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

以下是我尝试使用的内容:

sed -rn "s/^\*\ [^\[]*\[([^\]]*)\].*$/\1/p";

有些人会知道^\*\匹配是针对当前分支的。然后,在[之前捕获所有内容之前,我尝试匹配除].之外的所有内容。不幸的是,匹配似乎与我的第一个子句没有什么不同,这是一个简单的.*\[(.*)\].*$.任何包含成对方括号的提交我的剧本变得疯狂了。

我可以通过喂食来故意破坏我的条款:

* haha 2b35744 [twodeep: ahead 1] Bad comments contain hashes followed by brackets... bad2bad [].

请注意,sed匹配位于第二对方括号之间。我想匹配twodeep: ahead 1,但我的子句返回一个空字符串(在第二对方括号之间匹配)。我觉得这可能是awk的情况。

4 个答案:

答案 0 :(得分:0)

试试这个:

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

您不应该在字符范围内转义方括号,只需将它们放在列表的开头即可。因此,您只需在模式中将[^\]]替换为[^]],将[^\]]替换为[^]]

答案 1 :(得分:0)

如果您不需要:

...

private Mat processedFrame;

@Override
public void onCameraViewStarted(int width, int height) {
    processedFrame = new Mat();
    ...
}

@Override
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    final Mat frame = inputFrame.rgba();  
    Mat result = bs.process(frame);   
    result.copyTo(processedFrame);
    result.release(); 
    return processedFrame;
}

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

答案 2 :(得分:0)

使用TXR

$ 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

gitbranchvvv.txr中的代码:

@(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)

前面/后面的grokking可以缩小。但这需要比复制和粘贴更多的努力;何必。而且,六个月后代码可能难以理解。

答案 3 :(得分:-2)

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

git branch -vv | sed -rn 's/^\*\ (.*)$/\1/p' | awk -F\[ '{print $2}' | awk -F\] '{print $1}'

这匹配活动分支,并解析第一个方形括号和下一个方括号之间的位。分支名称允许包含结束方括号。就其本身而言,sed似乎与该行上的一个字符的最后一个实例相匹配。使用awk比sed更可靠。