如何在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