使用 tr 删除特定字符串



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

tr -d "1."

并且输入是1.1231的,它会23显示为输出,但我希望它显示1231(请注意,只有第一个1已经消失)。我该怎么做?

如果您知道解决方案或更好的方法,请解释语法,因为我不想只是复制和粘贴,而是学习。

我对awk有很大的问题,所以如果你使用它,请进一步解释。

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

示例:echo '1.1231' | cut -d '.' -f 2将返回1231

有关切割的更多信息,只需键入 man cut

你最好使用某种正则表达式(也许像sed这样的东西)。

例如,对于输入 1.1231,您可以使用以下命令来获取 1231 输出:

sed 's/1.//g'

也许看看这里:http://tldp.org/LDP/abs/html/string-manipulation.html

您也可以将 sed 用于此类操作:

$ echo "1.1231" | sed -e "s/1.//"
1231

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

如果您使用的是 bash ,则可以通过参数替换轻松完成此操作:

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

这将删除前导"1."字符串。如果要删除(包括第一个匹配项),请使用${a#*1.};如果要删除直到并包括最后一个匹配项的所有内容,请使用 ${##*1.}

有关字符串操作的 TLDP 页面还有其他选项(例如子字符串提取)。

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

既然你特别问了awk,这里是另一个。

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

正如任何awk教程都会告诉您的那样,awk程序的一般形式是一系列"条件{动作}"。 如果没有操作,则默认操作是打印。 如果您没有条件,将无条件采取行动。 该程序使用这两种特殊情况。

第一部分是无条件的操作,即将对所有行采取。 该操作是将正则表达式的所有匹配项替换为任何内容/1./。 因此,这将修剪任何"1"。(无论上下文如何)从一行。

第二部分是没有动作的条件,即如果条件为真,它将打印,并且条件始终为真。 这是"我们完成了 - 打印我们现在拥有的任何东西"的常见成语。 它仅由常量1组成(当用作条件时,简单地表示"真")。

这可以通过多种方式重新表述。 例如,您可以将打印因素分解到第一个操作中;

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

也许您想替换整数部分,即句号之前的任何数字。 正则表达式类似于 /[0-9]+./ .

gsub 是一个 GNU 扩展,所以如果你需要移植到遗留awk语法,你可能想用sub或某种循环来替换它。

最新更新