gpt4 book ai didi

regex - 使用 sed 更改找到的模式中的任意数量的分隔符

转载 作者:行者123 更新时间:2023-12-03 17:43:38 28 4
gpt4 key购买 nike

我想每换一次. @.@ 使用 sed,但前提是 .用数字括起来。
例如:

This sentence ends with a dot. 1.2.3
Dot. 1.2.3.4.5 Dot.
目标:
This sentence ends with a dot. 1 @.@ 2 @.@ 3
Dot. 1 @.@ 2 @.@ 3 @.@ 4 @.@ 5 Dot.
该模式可以包含 任意号码 整数。
我试过:
sed -E 's/([0-9]+)\.([0-9]+)/\1 @\.@ \2/g'
但它只适用于模式中的前两个数字。

最佳答案

对于重复模式(数字-点-数字-点-数字...),替换不起作用,因为点后面的数字是
“已消耗”,因此引擎沿字符串移动,因此它看到的下一个字符是一个点,而不是所需的 num-dot-num 模式。
一种解决方案是使用 lookarounds ,† 是“零宽度”断言,因此引擎不会消耗匹配项并且不会移动,但它只是从字符之间的“位置”“查看”以断言模式(向前或后面)匹配,可以这么说

s/ (?<=[0-9]) \. (?=[0-9]) / @.@ /gx;
对于可测试的示例(在 Perl 中,已标记)
perl -wE'$_=q(Dot. 1.2.3.4.5 Dot.); say; s/(?<=[0-9])\.(?=[0-9])/ @.@ /g; say'
哪个打印
Dot. 1.2.3.4.5 Dot.Dot. 1 @.@ 2 @.@ 3 @.@ 4 @.@ 5 Dot.

But the lookbehind won't work with a "number" that consists of more than one digit, since then we'd need [0-9]+ which has variable and unlimited length, whiat lookbehinds can't (yet) do.

If it is indeed possible to have multi-digit numbers in your case, then the number before the . need be captured -- this still works with the number before the dot -- and then put back

s/([0-9]+)\.(?=[0-9])/$1 @.@ /g;
当然,这无论如何都可以完成,即使它总是个位数;我最初使用后视只是为了与另一侧的对称(需要先行)

† 在支持它们的工具中,据我所知 sed不是。 (感谢 potongEd Morton 的评论)我仍然提供这个解决方案,因为 Perl 是标记语言之一。

关于regex - 使用 sed 更改找到的模式中的任意数量的分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66418754/

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