假设我有一个字符串
1:2:3:4:5
,我想要获取它的最后一个字段(在这种情况下是5
)。在Bash中如何实现?我尝试使用cut
,但我不知道如何使用-f
指定最后一个字段。你可以使用字符串运算符:
$ 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
这使得获取倒数第二个字段或任何从末尾编号的字段范围非常容易。
echo "1 2 3 4" | rev | cut -d " " -f1 | rev
- funrollrev
,这正是我需要的!cut -b20- | rev | cut -b10- | rev
- shearn89使用cut命令获取最后一个字段比较困难,但是这里有一些使用awk和perl的解决方案
echo 1:2:3:4:5 | awk -F: '{print $NF}'
echo 1:2:3:4:5 | perl -F: -wane 'print $F[-1]'
/
字符的路径:当处理 pwd | awk -F/ '{print $NF}'
时, /a/b/c/d
和 /a/b/c/d/
将产生相同的结果(d
)。而已接受的答案在 /a/b/c/d/
的情况下会产生空结果。 - eckesawk '{$NF=""; print $0}' FS=: OFS=:
这样的东西通常足够好用。 - William Pursell假设使用相对简单(例如没有转义分隔符),可以使用grep:
$ echo "1:2:3:4:5" | grep -oE "[^:]+$"
5
找出 Breakdown - 在每行结尾的所有非分隔符 ([^:]) 字符。 -o 参数只打印匹配部分。
如果您想使用cut
,可以尝试以下内容:
echo "1:2:3:4:5" | cut -d ":" -f5
你也可以像这样使用grep
:echo " 1:2:3:4:5" | grep -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(版本大于等于3.2)正则表达式:
var1="1:2:3:4:5"
[[ $var1 =~ :([^:]*)$ ]]
var2=${BASH_REMATCH[1]}
$ echo "a b c d e" | tr ' ' '\n' | tail -1
e
只需要将分隔符翻译成换行符,并使用tail -1
选择最后一个条目。
\n
,它将失败,但对于大多数情况来说,这是最可读的解决方案。 - Yajosed
命令:$ 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
这里有很多好的答案,但我还是想分享一个使用 basename 的答案:
basename $(echo "a:b:c:d:e" | tr ':' '/')
然而,如果您的字符串中已经存在一些斜杠 /,则此方法将失败。如果斜杠 / 是您的分隔符,则只需(应该)使用 basename 命令。
这可能不是最好的答案,但它展示了您如何在使用 bash 命令时有创意。
a
的最后一个 _字符_,而不是最后一个 _字段_。 - gniourf_gniourf
1:2:3:4:5:
,也会返回5
(而使用字符串操作符则会产生空结果)。当解析可能包含(或不包含)结尾/
字符的路径时,这种方法特别方便。 - eckes${foo%:*}
。#
表示从开头匹配,%
表示从结尾匹配。#
和%
表示最短匹配,而##
和%%
表示最长匹配。 - Mihai Danilaecho ${pwd##*/}
不起作用。 - Putnikpwd
视为一个变量。尝试使用dir=$(pwd); echo ${dir##*/}
。对我来说有效! - Stan Strum