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

can*_*cse 27 unix string shell awk sed

所以我有这个字符串:

$var=server@10.200.200.20:/home/some/directory/file
Run Code Online (Sandbox Code Playgroud)

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

/home/some/directory/file
Run Code Online (Sandbox Code Playgroud)

谢谢.

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

fal*_*tru 36

使用sed:

$ var=server@10.200.200.20:/home/some/directory/file
$ echo $var | sed 's/.*://'
/home/some/directory/file
Run Code Online (Sandbox Code Playgroud)

  • @SopalajodeArrierez,给定的命令将起作用.请参阅http://asciinema.org/a/16807(因为`.*`将尽可能匹配:贪婪) (3认同)
  • 如果原始字符串具有多个`:`字符怎么办?就像$var=server@10.200.200.20:administrators:/ home / some / directory / file`一样。我们如何仅获取最后一个字段(路径数据)? (2认同)

pot*_*ong 26

这可能对你有用:

echo ${var#*:}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你不解释它是如何工作的,那就是无用的答案.可在此处找到解释:http://stackoverflow.com/a/19482947/1220835 (6认同)

cht*_*mon 10

为了完整性,使用切割

cut -d : -f 2 <<< $var
Run Code Online (Sandbox Code Playgroud)

并且只使用bash:

IFS=: read a b <<< $var ; echo $b
Run Code Online (Sandbox Code Playgroud)


小智 10

这也可以.

echo $var | cut -f2 -d":"
Run Code Online (Sandbox Code Playgroud)


Chr*_*our 7

这应该做的伎俩:

$ echo "$var" | awk -F':' '{print $NF}'
/home/some/directory/file
Run Code Online (Sandbox Code Playgroud)


Tob*_*ght 7

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

参数扩展

...

${parameter#word}

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

换句话说,你可以写

$var="${var#*:}"
Run Code Online (Sandbox Code Playgroud)

这将从中删除任何匹配*:的内容$var(即,直到并包括第一个:)。如果您想匹配到最后一个:,那么您可以使用##代替#

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