如何在unix中的特定字符后剪切字符串

时间:2013-08-23 07:57:55

标签: string shell unix sed awk

所以我有这个字符串:

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

我只想提取目录地址,这意味着我只希望在“:”字符后面的位并得到:

/home/some/directory/file

感谢。

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

7 个答案:

答案 0 :(得分:33)

使用sed:

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

答案 1 :(得分:24)

这可能对您有用:

echo ${var#*:}

请参阅Example 10-10. Pattern matching in parameter substitution

答案 2 :(得分:10)

为了完整性,使用剪切

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

仅使用bash:

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

答案 3 :(得分:10)

这也可以。

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

答案 4 :(得分:7)

这应该可以解决问题:

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

答案 5 :(得分:4)

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

  

参数扩展

     

...

     

${parameter#word}

     

删除最小的前缀模式    word被扩展为生成模式。然后参数扩展导致parameter,前缀的最小部分与删除的模式匹配。

换句话说,你可以写

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

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

这是假设要删除的部分不包含:(IPv4地址为true,但IPv6地址无效)

答案 6 :(得分:2)

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