GNU sed, ^ и $ с | когда первый / последний символ совпадает

При выполнении замены, которая включает в себя что-то вроде ^|. в REGEXP sed не совпадает с пустой строкой в ​​начале пространства шаблона, если первый символ совпадает. Это также не соответствует концу, если последний символ соответствует. Это почему?

Вот несколько примеров использования 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

Попробуйте онлайн!

1 ответ

Решение

AFAIK sed постарается сопоставить самый длинный матч в чередовании.

Поэтому, когда пустая строка в начале пространства шаблона может быть сопоставлена ​​с 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.
Другие вопросы по тегам