我正在尝试将这两个作为群组捕获:(.*}
和[.*]
来自:{/ 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来解决这个问题。
答案 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"