29

我有一个字符串,它是另一个命令的输出。我只需要显示这个字符串的结尾。分隔符字符串是“ .”(点和空格),我需要“ .”的最后一个索引之后的字符串。

我怎样才能在 Bash 中做到这一点?

4

4 回答 4

40

如果字符串在变量中:

$ foo="header. stuff. more stuff"
$ echo "${foo##*. }"
more stuff

如果有多个“。”实例(如我的示例),并且您想要第一次出现之后的所有内容,而不是最后一次,只需使用一个#

$ echo "${foo#*. }"
stuff. more stuff
于 2013-03-21T13:15:36.727 回答
31

试试这个:

your cmd...|sed 's/.*\. //'

无论您的输入中有多少“点”或“点和空格”,这都有效。它采用最后一个“点和空格”之后的字符串

于 2013-03-21T13:04:10.620 回答
9

awk 是优雅的武器......对于更文明的时代:

[cpetro01@h ~]$ echo "this. is. my. string. of. some. arbitrary. length" | awk -F'. ' ' { print $NF } '
length
[cpetro01@h ~]$ echo "this. is. my. string. of. some" | awk -F'. ' ' { print $NF } '   
some

在这种情况下,NF 是“字段数”的 awk 变量,并且此构造表示“在找到的最多字段中打印条目”,因此如果输入的大小从一行更改为下一行,您仍然会得到最后一个。

你也可以做数学:

[cpetro01@h~]$ echo "this. is. my. string. of. some. arbitrary. length" | awk -F'. ' ' { print $(NF-2) } '
some
[cpetro01@h~]$ echo "this. is. my. string. of. some. arbitrary. length" | awk -F'. ' ' { print $(NF-3) } '
of
[cpetro01@h~]$

(是的,这对于 OP 来说已经晚了 3 年,但是我的一位同事今天将我指向了这个页面,因为我们正在做一些事情,所以我想我会把它放在这里以防其他人也在寻找。)

于 2016-05-04T17:34:59.430 回答
7

试试这个:

echo "This is a sentence. This is another sentence" | rev | cut -d "." -f1 | rev

rev反转输出。指定分隔符,将-d所有内容分解为字段。-f指定要使用的字段。 我们可以选择f1,因为我们颠倒了数据。我们不需要知道总共有多少个字段。我们只需要知道第一个。最后,我们再次反转它,以正确的顺序放回它。

于 2013-03-21T13:04:49.147 回答