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
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.
当在 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
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.