从字符串中删除一个精确的字符序列,使用 tr -d 命令。

5

我想使用tr -d从一个已有的字符串中移除一串字符,而不是随意删除其他字符。

例如,我希望trfoo.txt中每个字符串的结尾处移除: OK

foo.txt的内容:

BROKEN BONES: OK
Kefen Odvora: OK
BOOKS_FOR_MUM: OK
E: OK Amded: OK

这是我运行的命令:

cat foo.txt | tr -d ": OK$"

我希望它输出这个:
BROKEN BONES
Kefen Odvora
BOOKS_FOR_MUM
E: OK Amded

但是我得到的却是这个,而我不想要这个:
BRENBNES
efendvora
BS_FR_MUM
EAmded

我该如何解决这个问题?

我的操作系统是Mac OS X Yosemite,使用的是bash 3.2.57(1)-release。

2个回答

14

你使用了错误的工具。你需要使用 sed,而不是 tr

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

或者更好的选择

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

当您的输入确实只是一个文件,而非更复杂的命令时。


tr -d会删除参数中任何字符的所有出现;它不会将其作为正则表达式来匹配和删除。具体来说,您将从每行中删除:OK$的所有出现。


1
在我看来,不需要使用 cat,因为 sed 可以直接读取 Input_file。 - RavinderSingh13
3
是的,我把它留作原问题的占位符,以防输入是更复杂命令的输出。如果输入确实只是一个文件,那么sed 's/: OK$//' foo.txt就足够了。 - chepner
非常好用,谢谢!是的,我只会将它用于纯文本文件。如果我要使用它来处理复杂的命令,我需要使用什么? - leetbacoon

1

awk 在这里很有帮助。

awk '{sub(/: OK$/,"")} 1'  Input_file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接