31

所以我有这个字符串:

$var=server@10.200.200.20:/home/some/directory/file

我只想提取目录地址,这意味着我只想要“:”字符之后的位并获得:

/home/some/directory/file

谢谢。

我需要一个通用命令,因此 cut 命令将不起作用,因为 $var 变量没有固定长度。

4

7 回答 7

45

Using sed:

$ var=server@10.200.200.20:/home/some/directory/file
$ echo $var | sed 's/.*://'
/home/some/directory/file
于 2013-08-23T07:59:15.803 回答
29

这可能对您有用:

echo ${var#*:}

例 10-10。参数替换中的模式匹配

于 2013-08-23T08:03:56.023 回答
16

这也行。

echo $var | cut -f2 -d":"
于 2013-09-06T05:13:57.287 回答
11

为了完整起见,使用 cut

cut -d : -f 2 <<< $var

并且只使用 bash:

IFS=: read a b <<< $var ; echo $b
于 2013-08-23T08:03:36.047 回答
7

This should do the trick:

$ echo "$var" | awk -F':' '{print $NF}'
/home/some/directory/file
于 2013-08-23T07:59:29.833 回答
7

你没有说你正在使用哪个外壳。如果它是 POSIX 兼容的,例如 Bash,那么参数扩展可以做你想做的事:

参数扩展

...

${parameter#word}

删除最小前缀模式。
word扩展以产生图案。参数扩展然后导致parameter,前缀的最小部分与模式匹配删除。

换句话说,你可以写

$var="${var#*:}"

这将删除任何匹配*:$var内容(即所有内容,包括第一个:)。如果你想匹配到最后一个:,那么你可以使用##代替#.

这一切都假设要删除的部分不包含:(对于 IPv4 地址是正确的,但对于 IPv6 地址不是)

于 2016-11-01T16:46:49.120 回答
3
awk -F: '{print $2}' <<< $var
于 2013-08-23T07:59:55.783 回答