是否可以在 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
内置字符串操作工具进行此类简单转换始终比使用外部工具(如 sed
、awk
或 cut
)快得多,因为 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
或某种循环来替换它。