是否可以在UNIX-Shell中使用tr
命令删除特定字符串?
例如:如果我输入:
tr -d "1."
并且输入为1.1231
,它会显示23
作为输出,但我希望它显示1231
(注意只有第一个1
已经消失)。我该怎么做?
如果你知道解决方案或更好的方法,请解释语法,因为我不想复制和粘贴,但也要学习。
我的awk存在很大问题,所以如果你使用它,请更多地解释一下。
答案 0 :(得分:11)
你最好使用某种正则表达式(也许像sed这样的东西)。
例如,使用输入1.1231,您可以使用以下内容获取1231输出:
sed 's/1\.//g'
也许看看这里: http://tldp.org/LDP/abs/html/string-manipulation.html
答案 1 :(得分:6)
在上面的例子中, cut 命令就足够了。
示例:echo '1.1231' | cut -d '.' -f 2
将返回1231
。
有关剪切的详细信息,只需键入man cut
。
答案 2 :(得分:5)
您也可以将sed用于此类事情:
$ echo "1.1231" | sed -e "s/1\.//"
1231
这只是使用sed运行正则表达式搜索和替换,替换“1”。 (适当的逃脱)与“”。它默认只删除第一个匹配。
答案 3 :(得分:4)
如果您使用的是bash
,则可以使用parameter substitution轻松完成此操作:
$ a=1.1231
$ echo ${a#1.}
1231
这将删除前导 "1."
字符串。如果您要删除第一个出现的内容,请使用${a#*1.}
,如果要删除所有内容(包括 last ),请使用{ {1}}。
string manipulation上的TLDP页面还有其他选项(例如子字符串提取)。
请注意,使用标准${##*1.}
内置字符串操作工具进行此类简单转换的速度总是比使用外部工具快得多,例如sh
,sed
或{{1因为shell不必创建子进程来执行操作。但是,对于更复杂的事情(例如,您需要使用正则表达式或输入很大),您最好使用专用工具。
答案 4 :(得分:2)
由于您专门询问了awk
,这是另一个。
awk '{ gsub(/1\./,"") }1' input.txt
正如任何awk
教程都会告诉你的那样,awk
程序的一般形式是'condition {actions}'序列。如果您没有操作,则默认操作是打印。如果您没有条件,将无条件地采取行动。该程序使用这两种特殊情况。
第一部分是没有条件的动作,即它将被用于所有行。该操作是用任何东西替换所有出现的正则表达式/1\./
。所以这将削减任何'1'。 (无论背景如何)来自一条线。
第二部分是没有动作的条件,即如果条件为真则将打印,条件始终为真。这是“我们完成了 - 打印现在的任何东西”的常用习语。它只包含常量1
(当用作条件时,简单地表示“真”)。
这可以通过多种方式重新制定。例如,您可以将打印因素分解为第一个操作;
awk '{ gsub(/1\./,""); print }' input.txt
也许您想要替换整数部分,即句点符号之前的任何数字。正则表达式就像/[0-9]+\./
。
gsub
是一个GNU扩展,因此如果您需要可移植到遗留sub
语法,可能需要将其替换为awk
或某种循环。