考虑这个命令:
echo "string.with.dots" | sed 's/\(.*\)\.\(.*\)/\1\n\2/'
(将任何字符匹配到第一个捕获组,直到最后.
一个字符,并将其之后的任何字符匹配到第二个捕获组。)
这输出:
string.with
dots
合理地(我认为)我认为在正确的组合中使用锚点会设法扭转这种行为(即比赛将string
针对第一个捕获组和with.dots
第二个捕获组),但是:
echo "string.with.dots" | sed 's/^\(.*\)\.\(.*\)/\1\n\2/'
echo "string.with.dots" | sed 's/^\(.*\)\.\(.*\)$/\1\n\2/'
echo "string.with.dots" | sed 's/\(.*\)\.\(.*\)$/\1\n\2/'
所有输出:
string.with
dots
我不知道模式匹配是如何实现的,但它似乎总是优先考虑更接近字符串开头的模式,而不是更接近字符串结尾的模式(尽管存在^
或缺失$
)。
如果可能的话,如何改变这种行为(即不是如何为此示例编写硬编码解决方案,而是如何将模式匹配优先级顺序反转为sed
一般的正则表达式)?
要得到你想要的,试试这个:
测试:
sed
会贪婪地匹配,所以当你使用sed 's/\(.*\)\.\(.*\)/\1\n\2/'
它时,它会贪婪地匹配到最后.
一个捕获的组,然后.
是第二个之后的其余部分。在我看来
sed
,为了停止sed
贪婪,我必须寻找一些替代方案。我从一开始就将 a.
作为第一组 ([^.]*
) 进行匹配,然后在第一场比赛之后将其作为第二组进行匹配。现在,如果您希望所有部分都
.
在不同的行中:添加两个
rev
并交换\1
and\2
:输出:
我想知道你是否可以使用 bash参数扩展