Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用tr删除特定字符串_Bash_Unix_Command_Tr - Fatal编程技术网

Bash 使用tr删除特定字符串

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来运行正则表达式搜索

是否可以在UNIX Shell中使用
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