You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用sed/tr移除含特定子串的字符串?解决正则贪婪匹配问题

解决sed贪婪匹配问题,移除行尾特定控制字符及前置内容

问题分析

你的命令sed 's/ .*\[K//g出现错误,核心原因有两个:

  1. 贪婪匹配:.*会匹配从第一个空格到[K之间的所有内容,包含了你需要保留的有效文本;
  2. 字符匹配错误:文件中的^[是ASCII ESC控制字符(十六进制\x1b),而非字面的^和[,原命令中的\[K无法正确匹配目标内容。

正确命令

使用以下sed命令即可实现需求:

sed 's/\(.*\) .*\x1b\[K/\1/' myfile

命令解释

  • \(.*\):贪婪匹配到最后一个空格之前的所有内容(即你需要保留的有效文本),并将其捕获为分组1;
  • .*\x1b\[K:匹配从最后一个空格开始,直到行尾的ESC[K控制字符的所有冗余内容;
  • \1:将匹配到的内容替换为捕获的分组1,从而保留有效文本,删除目标冗余内容。

验证效果

处理后的输出将符合你的期望:

1. The cat is black
2. The dog is large
3. The sky is blue
4. Grass is green

兼容POSIX sed的替代方案

如果使用的是不支持\x1b的POSIX sed,可以在shell中直接输入ESC字符(按下Ctrl+V再按ESC):

sed 's/\(.*\) .*^[\[K/\1/' myfile

(注:上述命令中的^[是实际的ESC字符,而非输入^和[)

内容的提问来源于stack exchange,提问作者Mathew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:22:36