如何在Unix中截取特定字符后的字符串

40

所以我有一个字符串:

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

我只想提取目录地址,也就是说我只想得到":"字符后面的内容:

/home/some/directory/file

谢谢。

我需要一个通用命令,因为$var变量的长度不固定,所以cut命令无法使用。

7个回答

51

使用sed:

$ var=server@10.200.200.20:/home/some/directory/file
$ echo $var | sed 's/.*://'
/home/some/directory/file

3
如果原始字符串有多个:字符怎么办?例如 $var=server@10.200.200.20:administrators:/home/some/directory/file。我们应该如何获取最后一个字段(即路径数据)? - Sopalajo de Arrierez
3
@SopalajodeArrierez,给定的命令可以直接使用。请参见http://asciinema.org/a/16807(因为`.*`将尽可能匹配最多的内容:贪婪模式)。 - falsetru
我喜欢使用sed命令,因为它更易于阅读! - dave

32

1
不要在shell内置语法已经存在的情况下使用晦涩难懂的外部工具。如果您不需要兼容旧版本的shell,可以尝试探索"${var##*:}"。但是,除非您特别需要空格分词,否则不要省略变量插值周围的双引号。 - tripleee
@tripleee 这里有一点小挑剔...s/older shells/non-POSIX shells/. 参数扩展包括 ${var#...}${var##...} 是由 POSIX 定义的。 - Adrian Frühwirth
7
如果您不解释它的工作原理,那么这将是一个相当无用的回答。这里可以找到解释:https://dev59.com/mmIk5IYBdhLWcg3wNru8#19482947 - Basti
注意:如果没有分号,则不需要替换。 - mcoolive

25

这个也可以。

echo $var | cut -f2 -d":"

12

为了完整起见,使用切割(cut)命令

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

并且只使用bash:

IFS=: read a b <<< $var ; echo $b

9
您没有说明使用的是哪种shell。如果是类似Bash这样的符合POSIX标准的shell,那么参数扩展可以实现您想要的功能:
参数扩展 ${parameter#word}
删除最小前缀模式。 word被扩展为一个模式。参数扩展结果为parameter,其中与模式匹配的最小前缀部分被删除。
换句话说,您可以这样写:
$var="${var#*:}"

这将从$var中删除与*:匹配的任何内容(即,包括第一个:及其前面的所有内容)。如果要匹配到最后一个:,可以使用##代替#

这一切都基于要删除的部分不包含:(IPv4地址为真,但IPv6地址不是)的假设。


7

这应该能解决问题:

$ echo "$var" | awk -F':' '{print $NF}'
/home/some/directory/file

3
awk -F: '{print $2}' <<< $var

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接