无法捕获几个群组

时间:2017-11-24 18:56:44

标签: regex bash shell sed

我正在尝试将这两个作为群组捕获:(.*}[.*]来自:{/ p>

blahBLACK(+){+}tao[,Tom]101111foo

所以我希望(+){+}[,Tom]分别成为一个群组。

我试过了:

echo "blahBLACK(+){+}tao[,Tom]101111foo" | sed -E 's/(\[.*\]) (\(.*})/\2\1---/'

但它只是输出整行blahBLACK(+){+}tao[,Tom]101111foo而不改变任何东西,它只适用于一个组,只有当我做sed -E 's/(\[.*\])/\1---/'时,我才能看到它做了一些事情:

blahBLACK(+){+}tao[,Tom]---101111foo

但我想要的输出是这个,对于几个小组:

[,Tom](+){+}---blahBLACKtao101111foo

为什么不制作两个小组,如何获得我想要的输出?

编辑:我不得不使用sed来解决这个问题。

2 个答案:

答案 0 :(得分:3)

您的模式不匹配,因为:

  • [,Tom]在输入中 (*){*}之后

  • 输入文字中没有空格字符,但模式中有一个空格字符。

“按任意顺序匹配A和B”没有正则表达式语法,所以如果你不知道它们在哪个顺序,你就必须尝试这两种可能性。

一种可能的解决方案是首先将括号内的子字符串移动到开头,然后移动另一个子字符串:

sed -E 's/(.*)(\[.*\])/\2\1/; s/(\[.*\])(.*)(\(.*})/\1\3\2---/'

答案 1 :(得分:3)

您可以认为您的输入有5个部分:

blahBLACK(+){+}tao[,Tom]101111foo
^^^^^^^^^      ^^^      ^^^^^^^^^
    1      2    3    4      5

你想重新排列它:

[,Tom](+){+}---blahBLACKtao101111foo
^^^^^^         ^^^^^^^^^   ^^^^^^^^^
   4     2         1     3     5

您可以编写捕获组并相应地重新排列它们:

sed -E 's/^(.*)(\(.*})(.*)(\[.*\])(.*)/\4\2---\1\3\5/' <<< "blahBLACK(+){+}tao[,Tom]101111foo"