Bash 使用tr删除特定字符串
是否可以在UNIX Shell中使用Bash 使用tr删除特定字符串,bash,unix,command,tr,Bash,Unix,Command,Tr,是否可以在UNIX Shell中使用tr命令删除特定字符串? 例如:如果我键入: tr -d "1." 输入是1.1231,它将23显示为输出,但我希望它显示1231(注意只有第一个1已经消失)。我该怎么做 如果您知道解决方案或更好的方法,请解释语法,因为我不想只是复制和粘贴,也想学习 我对awk有很大的问题,所以如果您使用它,请进一步解释。您也可以使用sed来实现这类功能: $ echo "1.1231" | sed -e "s/1\.//" 1231 这只是使用sed来运行正则表达式搜索
tr
命令删除特定字符串?
例如:如果我键入:
tr -d "1."
输入是1.1231
,它将23
显示为输出,但我希望它显示1231
(注意只有第一个1
已经消失)。我该怎么做
如果您知道解决方案或更好的方法,请解释语法,因为我不想只是复制和粘贴,也想学习
我对awk有很大的问题,所以如果您使用它,请进一步解释。您也可以使用sed来实现这类功能:
$ echo "1.1231" | sed -e "s/1\.//"
1231
这只是使用sed来运行正则表达式搜索和替换,将“1”(带有适当的转义)替换为“”。默认情况下,它只删除第一个匹配项。如果您使用的是
bash
,您可以使用以下工具轻松完成此操作:
这将删除前导的“1”。
字符串。如果要删除第一个事件之前的所有内容(包括第一个事件),请使用${a#*1.}
;如果要删除最后一个事件之前的所有内容(包括最后一个事件),请使用${a#*1.}
上的TLDP页面具有更多选项(例如子字符串提取)
请注意,使用标准的
sh
内置字符串操作工具进行此类简单转换总是比使用外部工具(例如sed
、awk
或cut
)快得多,因为shell不必创建子进程来执行操作。但是,对于更复杂的事情(例如,您需要使用正则表达式或当输入较大时),最好使用专用工具。在上面的示例中,使用剪切命令就足够了
示例:echo'1.1231'| cut-d'。-f2
将返回1231
有关cut的更多信息,只需键入
mancut
您最好使用某种正则表达式(可能类似于sed)
例如,对于输入1.1231,可以使用以下方法获得1231输出:
sed 's/1\.//g'
也许你可以看看这里:
既然您特别询问了
awk
,下面是另一个问题
awk '{ gsub(/1\./,"") }1' input.txt
任何awk
教程都会告诉您,awk
程序的一般形式是一系列“条件{actions}”。如果没有操作,默认操作是打印。如果您没有条件,将无条件采取行动。该程序使用这两种特殊情况
第一部分是无条件的行动,即对所有线路采取行动。操作是将正则表达式/1\./
的所有匹配项替换为零。因此,这将从一行中删除任何“1”。(不考虑上下文)
第二部分是没有动作的条件,即如果条件为真,并且条件始终为真,它将打印。这是一个常见的成语,意思是“我们已经完成了——打印我们现在拥有的一切”。它只是由常量1
(当用作条件时,简单地表示“true”)组成
这可以通过多种方式重新制定。例如,您可以在第一个操作中考虑打印
awk '{ gsub(/1\./,""); print }' input.txt
也许您想替换整数部分,即句号之前的任何数字。这个函数的正则表达式类似于/[0-9]+\./
gsub
是一个GNU扩展,因此如果需要移植到遗留awk
语法,您可能需要用sub
或某种循环来替换它。直接答案是“否”tr
替换单个字符,而不是字符串。因此(a)您的命令将删除输入中任何地方出现的所有“1”和“.”;(b)tr
不是您所询问的任务的正确命令。这也是一个很好的解决方案!谢谢。“tr”的用法很好,我同意对于简单的表达来说,它更容易使用和阅读。
awk '{ gsub(/1\./,""); print }' input.txt