使用tr命令删除特定字符串

35

在UNIX-Shell中是否可能使用tr命令删除特定字符串?例如,如果我输入:

tr -d "1."
如果输入是1.1231,它将显示23作为输出,但我希望它显示1231(注意只有第一个1消失了)。我该如何做?
如果您知道解决方案或更好的方法,请解释一下语法,因为我不想只是复制粘贴,也想学习。
我对awk有很大的问题,所以如果您使用它,请更详细地解释。

10
直接的答案是“不行”;tr 是替换单个字符而不是字符串,因此 (a) 你的命令会删除输入中任何位置出现的所有 "1" 和 ".";(b) tr 不是你所要求的任务的正确命令。 - tripleee
5个回答

21

在上面的例子中,cut 命令就足够了。

例如:echo '1.1231' | cut -d '.' -f 2 会返回 1231

要了解更多关于cut的信息,只需键入 man cut


14

"很好地运用了'tr',我同意这样做更容易使用和阅读,对于简单的表达式来说。" - ThorSummoner

9
您可以使用sed来完成此类操作:
$ echo "1.1231" | sed -e "s/1\.//"
1231

这只是使用sed来运行正则表达式的搜索和替换,将“1。”(适当进行转义)替换为“”。默认情况下,它仅删除第一个匹配项。


5

如果你正在使用 bash,你可以轻松地通过参数替换来完成:

$ a=1.1231
$ echo ${a#1.}
1231

这将去除"1."字符串前面的部分。如果您要删除包括第一个出现在内的内容,可以使用${a#*1.} ,如果您想要删除包括最后一次出现在内的所有内容,则使用${##*1.}

TLDP有关字符串操作的页面提供了更多选项(例如子字符串提取)。

请注意,对于这种简单的转换,使用标准的sh内置字符串处理工具始终比使用外部工具(如sedawkcut)快得多,因为Shell不需要创建子进程来执行操作。然而,对于更复杂的事情(例如,您需要使用正则表达式或输入很大),最好使用专用工具。


这也是一个很好的解决方案!谢谢。 - intelinside

2

既然您特别询问了awk,这里再介绍一个。

awk '{ gsub(/1\./,"") }1' input.txt

任何一个 awk 教程都会告诉你,awk 程序的一般形式是一系列 'condition { actions }'。如果你没有 actions,则默认操作是打印。如果你没有条件,则无条件执行 actions。这个程序使用了这两种特殊情况。
第一部分是没有条件的操作,即对所有行都执行。该操作是用空字符串替换正则表达式 /1\./ 的所有出现。因此,它将从一行中删除任何 '1.'(不考虑上下文)。
第二部分是没有操作的条件,即如果条件为 true,则打印,并且条件始终为 true。这是一个常见的习惯用语,“我们完成了——现在打印我们所拥有的”。它仅包含常量 1(当用作条件时,表示“true”)。
这可以用多种方式重新表述。例如,可以将打印合并到第一个操作中;
awk '{ gsub(/1\./,""); print }'  input.txt

也许您想替换整数部分,即小数点前的任何数字。 正则表达式可能类似于/[0-9]+\./gsub是GNU扩展,因此如果您需要向后兼容旧版awk语法,则可能需要将其替换为sub或某种循环。请注意保留HTML标签。

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