30

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

tr -d "1."

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

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

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

4

5 回答 5

17

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

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

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

于 2012-04-23T14:39:24.760 回答
13

最好使用某种正则表达式(可能是 sed 之类的)。

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

sed 's/1\.//g'

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

于 2012-04-23T14:39:31.937 回答
8

您也可以将 sed 用于此类事情:

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

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

于 2012-04-23T14:33:29.987 回答
5

如果您正在使用,您可以通过参数替换bash轻松做到这一点:

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

这将删除前导 "1."字符串。如果要删除直到第一次出现(包括第一次出现),请使用${a#*1.},如果要删除直到最后一次出现(包括最后一次出现),请使用${##*1.}.

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

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

于 2012-04-23T14:34:08.813 回答
2

既然你专门问了awk,这里还有一个。

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

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

第一部分是一个没有条件的动作,即所有行都会执行。操作是用任何内容替换所有出现的正则表达式/1\./。所以这将修剪任何“1”。(无论上下文如何)从一行。

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

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

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

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

gsub是一个 GNU 扩展,因此如果您需要对遗留语法的可移植性,您可能希望用sub某种循环替换它。awk

于 2012-04-23T15:36:39.037 回答