tr
是否可以在 UNIX-Shell 中使用命令删除特定字符串?例如:如果我输入:
tr -d "1."
并且输入是1.1231
,它将显示23
为输出,但我希望它显示1231
(注意只有第一个1
已经消失)。我该怎么做?
如果您知道解决方案或更好的方法,请解释语法,因为我不想只是复制和粘贴,还想学习。
我对 awk 有很大的问题,所以如果你使用它,请进一步解释。
在上面的示例中,cut命令就足够了。
示例:echo '1.1231' | cut -d '.' -f 2
将返回1231
.
有关cut的更多信息,只需键入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 扩展,因此如果您需要对遗留语法的可移植性,您可能希望用sub
某种循环替换它。awk