匹配两个或模式并交换所有文本

时间:2019-03-06 11:29:15

标签: linux sed

我有一个问题,我需要将一个站点的标记更改为另一个站点。 首先,我使用以下类型: [[https://stackoverflow.com/][StackOverflow]],我需要将其更改为[StackOverflow|https://stackoverflow.com/]

为此,我的sed命令将为

sed -i 's/\[\[\(.*\)\]\[\(.*\)\]\]/\[\2|\1\]/g' 

这仅在我有一个匹配的模式行时有效,否则它将崩溃。我应该改变什么?

1 个答案:

答案 0 :(得分:1)

You may match any 0 or more chars using [^][] negated bracket expression:

sed -i 's/\[\[\([^][]*\)\]\[\([^][]*\)]]/[\2|\1]/g' file

See the online sed demo:

s="Text [[https://stackoverflow.com/][StackOverflow]] More text [[https://stackoverflow2.com/][StackOverflow2]]"
sed 's/\[\[\([^][]*\)\]\[\([^][]*\)]]/[\2|\1]/g' <<< "$s"

Output:

Text [StackOverflow|https://stackoverflow.com/] More text [StackOverflow2|https://stackoverflow2.com/]