GNU sed、^ 和 $ 与 |当 first/last 个字符匹配时

GNU sed, ^ and $ with | when first/last character matches

当在 REGEXP 中执行包含类似 ^|. 内容的替换时,如果第一个字符匹配,sed 将不匹配模式 space 开头的空字符串。如果最后一个字符匹配,它也不匹配结尾。这是为什么?

以下是一些使用 123 作为输入的示例(使用 -r 选项):

substitution    expected output     actual output   comments
s/^/x/g         x123                x123            works as expected
s/$/x/g         123x                123x            works as expected
s/^|$/x/g       x123x               x123x           works as expected
s/^|./x/g       xxxx                xxx             didn't match the very begining
s/.|$/x/g       xxxx                xxx             didn't match the very end
s/^|1/x/g       xx23                x23             didn't match the very begining
s/^|2/x/g       x1x3                x1x3            this time it did match the begining

我使用 \` 而不是 ^ 得到相同的结果。
我试过 GNU sed 版本 4.2.1 和 4.2.2

Try it online!

AFAIK sed 将尝试匹配交替中最长的匹配项。

所以当模式开头的空字符串 space 可以与相同位置的 1 匹配时。 1 被选中,因为它是最长的匹配项。

考虑以下几点:

$ sed 's/12\|123/x/g' <<< 123
x
$ sed 's/123\|12/x/g' <<< 123
x
$ sed 's/^1\|12/x/g' <<< 123
x3

到达终点也是如此。让我们打破 sed 's/.\|$/x/g' <<< 123

123
^
. matches and replace with x
x23
 ^
 . matches and replace with x
xx3
  ^
  . matches and replace with x
xxx
   ^
   Out of pattern space $ will not match.