gpt4 book ai didi

string - 从分隔的拆分字符串中删除所有子字符串匹配的高效/安全 shell 脚本?

转载 作者:行者123 更新时间:2023-12-04 16:16:52 25 4
gpt4 key购买 nike

对于由分隔符“:”分隔的字符串,匹配分隔符之间包含不同字符串“XXX”的所有子字符串的最佳方法是什么。

例如开始

/aa/:/a/b/XXX/:/bb/bb:/c/XXXd/e/f/:/cc/cc/

删除所有包含“XXX”的部分——可以是任何位置的任意#个实例——以结束

/aa/:/bb/bb:/cc/cc/

bash 可以直接这样做吗?用 awk 还是 sed 更好?

最佳答案

您要消除的每个条目都是一个非 : 序列,其中包含 XXX,在正则表达式世界中是 [^:]*XXX[^ :]*

但是你还想去掉它后面的:,这意味着你想匹配并去掉[^:]*XXX[^:]*: .

实际上,如果它恰好是最后一个,那将不允许您删除包含 XXX 的字段;要解决此问题,您需要匹配行尾作为结束 : 的替代,因此命令是

sed -E 's/[^:]*XXX[^:]*(:|$)//g' that_file

但是这仍然有一个问题:它会在最后一项匹配时留下尾随 :。要解决这个问题,我们可以简单地运行另一个替换 ad hoc,这样完整的 Sed 命令就是这样,

sed -E 's/[^:]*XXX[^:]*(:|$)//g;s/:$//' that_file

我们真的需要usbstitution 命令吗?

Sed 没有前瞻性,这意味着我们匹配的任何内容都被消耗掉,并且不能通过相同的s 命令再次匹配,即使有 g 标志。

另一方面,我们要消除包含 XXX 的字段,连同它周围的两个 : 中的一个,而不是两个>.

如果我们像我一样选择正确的 :,那么很明显如果最后一个字段(与行尾而不是 : 匹配)匹配XXX,它会留下尾随 : 的结果(除非所有字段都匹配 XXX,在这种情况下,结果为空字符串)。

这意味着单个 s 替换命令无法为您的用例的所有场景提供“干净”的答案。

如我所展示的,使用两个 s 命令就足以解决这个问题。

关于string - 从分隔的拆分字符串中删除所有子字符串匹配的高效/安全 shell 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63759391/

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