gpt4 book ai didi

regex - 如何在 sed 中保留其他捕获组的同时对捕获组进行后处理?

转载 作者:行者123 更新时间:2023-12-05 08:29:27 25 4
gpt4 key购买 nike

我有一个包含 3 个捕获组的字符串,我想保留第一个和第三个,但对第二个进行替换。我如何在 sed 中表达它?

具体来说,我有一个输入字符串,如:

top-level.subpath.one.subpath.two.subpath.forty-five

而且我想保留第一个.之前的部分,把中间部分缩短到每个单词的第一个字母,保留最后一个.之后的部分。结果应如下所示:

top-level.s.o.s.t.s.forty-five

为了保留捕获组,我有:

sed -r 's/([^.]*)(.*)(\..*)/\1...\3/'

这让我:

top-level....forty-five

为了将类似 .subpath.one.subpath.two.subpath 的内容转换为仅首字母,我有:

sed -r 's/(\.[^.])[^\.]*/\1/g'

这让我:

.s.o.s.t.s

我想基本上将第二个 sed 表达式应用于捕获组 2。有什么方法可以链接 sed 替换以仅对第二个捕获组执行第二个替换,同时保留第一个和第三个?

最佳答案

一个简单的 awk 解决方案,适用于任何版本的 awk,包括 MacOS:

s='top-level.subpath.one.subpath.two.subpath.forty-five'
awk 'BEGIN{FS=OFS="."} {for(i=2;i<NF;++i) $i=substr($i,1,1)}1' <<< "$s"

top-level.s.o.s.t.s.forty-five

awk 命令使用 . 作为输入和输出字段分隔符。我们遍历字段位置 2last-1 并将每个字段的值替换为该字段的第一个字符。最后打印全记录。


一个 BSD sed 解决方案来做同样的事情:

sed -E -e ':x' -e 's/(.+\..)[^.]+\./\1./; tx' <<< "$s"

top-level.s.o.s.t.s.forty-five

关于regex - 如何在 sed 中保留其他捕获组的同时对捕获组进行后处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70042628/

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