考虑这个命令:
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为正则表达式或反转为正则表达式)?
添加两个rev并交换\1和\2:
echo "string.with.dots" | rev | sed 's/\(.*\)\.\(.*\)/\2\n\1/' | rev
Run Code Online (Sandbox Code Playgroud)
输出:
细绳 带点