如何用sed/tr移除含特定子串的字符串?解决正则贪婪匹配问题
解决sed贪婪匹配问题,移除行尾特定控制字符及前置内容
问题分析
你的命令sed 's/ .*\[K//g出现错误,核心原因有两个:
- 贪婪匹配:
.*会匹配从第一个空格到[K之间的所有内容,包含了你需要保留的有效文本; - 字符匹配错误:文件中的
^[是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
相关产品推荐
相关产品推荐

