Unix中删除空格与K之间文本的sed命令问题求助
问题分析与解决办法
哦,我明白问题出在哪了——你原来的sed命令用了贪婪匹配,把从第一个空格到最后一个K之间的所有内容都一股脑删掉了,才得到了不符合预期的VMDJBJUPG。
为什么原命令不对?
原命令里的.*K是贪婪匹配模式,它会尽可能匹配最长的字符串:从VMDJBJ后面的第一个空格开始,一直匹配到整个字符串里最后一个K(也就是345K里的K),直接把中间的4G、15K300GB、7_34KDRV这些内容全删掉了,只留下开头的VMDJBJ和最后K后面的UPG。
正确的解决命令
我们需要匹配每个空格后面到第一个K(包括K)的内容,然后替换成空格(保留后面的有效文本)。用[^K]*来匹配除了K之外的任意字符,这样会在遇到第一个K时就停止匹配,避免贪婪。再加上g标志实现全局替换:
echo $'VMDJBJ 4G 15K300GB 7_34KDRV 345KUPG' | sed 's/[[:space:]][^K]*K/ /g'
运行这个命令后,你会得到完全符合预期的输出:VMDJBJ 4G 300GB DRV UPG
内容的提问来源于stack exchange,提问作者Umi
相关产品推荐
相关产品推荐

