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

如何使用tr -d精准移除字符串末尾指定字符而非全局删除?

哈哈,踩了tr的经典坑啦!

你用tr -d ": OK$"没用对,因为tr是字符级别的工具,它根本不会把: OK当成一个完整的字符串来处理——它会把你写的: OK$拆成单个字符::、空格、O、K、$,然后把每行里所有这些字符都删掉,这就是为什么你得到了乱七八糟的结果(比如把"BROKEN BONES"里的O、K都删没了)。

正确的姿势:用sed或者awk

这俩工具才是处理字符串匹配替换的好手,完美适配你“只删行尾: OK”的需求。

方法1:最常用的sed

直接用sed的替换命令,精准匹配行尾的目标字符串:

sed 's/: OK$//' foo.txt

拆解一下这个命令:

  • s/:表示启动替换操作
  • : OK$:$是正则里的行尾锚点,所以这个表达式只会匹配行末尾的: OK
  • //:把匹配到的内容替换成空,也就是直接删掉

运行后你就能得到完全符合预期的输出:

BROKEN BONES
Kefen Odvora
BOOKS_FOR_MUM
E: OK
Amded

方法2:用awk也能轻松搞定

awk的字符串替换能力也很强,一行命令就能搞定:

awk '{sub(/: OK$/, "")}1' foo.txt
  • sub(/: OK$/, ""):在当前行里替换第一个匹配(这里因为是行尾,所以就是唯一的): OK为空
  • 1:awk里的小技巧,相当于print $0,用来打印处理后的每行内容

再补一句:别用tr处理字符串序列

tr的本职工作是字符转换(比如大小写转换)、删除单个重复字符这类字符级别的操作,它不支持正则锚点,也不理解“字符串序列”的概念。以后要删特定字符串的时候,直接想到sed/awk就对啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:00:45