如何在shell中分割string并获取最后一个字段

假设我有string1:2:3:4:5 ,我想获得它的最后一个字段(在这种情况下是5 )。 我如何使用Bash做到这一点? 我试过cut ,但我不知道如何用-f指定最后一个字段。

你可以使用string运算符 :

 $ foo=1:2:3:4:5 $ echo ${foo##*:} 5 

这从前面修剪一切,直到一个“:”,贪婪。

 ${foo <-- from variable foo ## <-- greedy front trim * <-- matches anything : <-- until the last ':' } 

另一种方法是在cut之前和之后进行反转:

 $ echo ab:cd:ef | rev | cut -d: -f1 | rev ef 

这使得获取最后一个字段,或从最后编号的任何字段范围都非常容易。

使用剪切来获取最后一个字段是很困难的,但是这里有一组awk和perl的解决scheme

 $ echo 1:2:3:4:5 |  awk -F:'{print $ NF}'
五
 $ echo 1:2:3:4:5 |  perl -F:-wane'print $ F [-1]'
五

假设使用相当简单(例如,不能转义分隔符),可以使用grep:

 $ echo "1:2:3:4:5" | grep -oE "[^:]+$" 5 

细分 – 在行($)的末尾find所有不是分隔符([^:])的字符。 -o只​​打印匹配的部分。

单程:

 var1="1:2:3:4:5" var2=${var1##*:} 

另外,使用数组:

 var1="1:2:3:4:5" saveIFS=$IFS IFS=":" var2=($var1) IFS=$saveIFS var2=${var2[@]: -1} 

还有一个数组:

 var1="1:2:3:4:5" saveIFS=$IFS IFS=":" var2=($var1) IFS=$saveIFS count=${#var2[@]} var2=${var2[$count-1]} 

使用Bash(version> = 3.2)正则expression式:

 var1="1:2:3:4:5" [[ $var1 =~ :([^:]*)$ ]] var2=${BASH_REMATCH[1]} 
 $ echo "abcde" | tr ' ' '\n' | tail -1 e 

只需将分隔符转换为换行符,然后selecttail -1的最后一个条目。

使用sed

 $ echo '1:2:3:4:5' | sed 's/.*://' # => 5 $ echo '' | sed 's/.*://' # => (empty) $ echo ':' | sed 's/.*://' # => (empty) $ echo ':b' | sed 's/.*://' # => b $ echo '::c' | sed 's/.*://' # => c $ echo 'a' | sed 's/.*://' # => a $ echo 'a:' | sed 's/.*://' # => (empty) $ echo 'a:b' | sed 's/.*://' # => b $ echo 'a::c' | sed 's/.*://' # => c 

使用Bash。

 $ var1="1:2:3:4:0" $ IFS=":" $ set -- $var1 $ eval echo \$${#} 0 
 a="1:2:3:4:5" echo ${a: -1} echo ${a:(-1)} 

检查bash中的string操作

这里有很多好的答案,但是我仍然想用basename来分享这个答案。

  basename $(echo "a:b:c:d:e" | tr ':' '/') 

但是, 如果string中已经有一些“/”,将会失败 。 如果斜线/是你的分隔符,所以你只需要(而且应该)使用basename。

这不是最好的答案,但它只是显示如何使用bash命令来创造性。

 echo "a:b:c:d:e"|xargs -d : -n1|tail -1 

首先使用xargs使用“:”分割它, – n1意味着每行只有一个部分。然后,pring最后一部分。

 for x in `echo $str | tr ";" "\n"`; do echo $x; done