gpt4 book ai didi

bash - GNU sed、^ 和 $ 与 |当第一个/最后一个字符匹配时

转载 作者:行者123 更新时间:2023-11-29 09:46:28 27 4
gpt4 key购买 nike

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

Try it online!

最佳答案

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.

关于bash - GNU sed、^ 和 $ 与 |当第一个/最后一个字符匹配时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39808332/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com