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.