反转 sed/regexes 的模式匹配优先级顺序

kos*_*kos 6 regex sed

考虑这个命令:

echo "string.with.dots" | sed 's/\(.*\)\.\(.*\)/\1\n\2/'
Run Code Online (Sandbox Code Playgroud)

(匹配到第一个捕获组中的任何字符直到最后一个,.然后匹配到第二个捕获组中的任何字符。)

这输出:

string.with
dots
Run Code Online (Sandbox Code Playgroud)

合理地(我认为)我认为在正确的组合中使用锚点会设法扭转这种行为(即匹配将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/'
Run Code Online (Sandbox Code Playgroud)

所有输出:

string.with
dots
Run Code Online (Sandbox Code Playgroud)

我不知道模式匹配是如何实现的,但它似乎总是优先考虑靠近字符串开头的模式,而不是那些靠近字符串末尾的模式(尽管存在^或丢失$)。

如果可能的话,如何改变这种行为(即不是如何为此示例编写硬编码解决方案,而是如何将模式匹配优先级顺序反转sed为正则表达式或反转为正则表达式)?

Cyr*_*rus 3

添加两个rev并交换\1\2

echo "string.with.dots" | rev | sed 's/\(.*\)\.\(.*\)/\2\n\1/' | rev
Run Code Online (Sandbox Code Playgroud)

输出:

细绳
带点