Answers:
您可以使用字符串运算符:
$ foo=1:2:3:4:5
$ echo ${foo##*:}
5
贪婪地修剪从前到':'的所有内容。
${foo <-- from variable foo
## <-- greedy front trim
* <-- matches anything
: <-- until the last ':'
}
${foo%:*}
。#
- 从开始; %
-从头开始。#
,%
-最短匹配;##
,%%
-最长的比赛。
echo ${pwd##*/}
不起作用。
pwd
视为变量的@Putnik 。尝试dir=$(pwd); echo ${dir##*/}
。为我工作!
另一种方法是在前后扭转cut
:
$ echo ab:cd:ef | rev | cut -d: -f1 | rev
ef
这样很容易获得最后一个字段,或者从末尾开始编号的任何范围的字段。
echo "1 2 3 4" | rev | cut -d " " -f1 | rev
rev
,这正是我所需要的!cut -b20- | rev | cut -b10- | rev
使用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]'
/
符的路径:/a/b/c/d
并在处理时/a/b/c/d/
产生相同的结果(d
)pwd | awk -F/ '{print $NF}'
。在以下情况下,已接受的答案导致结果为空/a/b/c/d/
/
用作定界符,如果您的路径是AWK,它将使用/my/path/dir/
最后一个定界符之后的值,它只是一个空字符串。因此,如果您需要像我这样做,最好避免使用斜杠。
awk '{$NF=""; print $0}' FS=: OFS=:
通常效果很好。
假设用法非常简单(例如,不转义分隔符),则可以使用grep:
$ echo "1:2:3:4:5" | grep -oE "[^:]+$"
5
细分-在行($)的末尾查找所有字符,而不是定界符([^:])。-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
,它将失败,但在大多数情况下是最易读的解决方案。
使用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
for x in `echo $str | tr ";" "\n"`; do echo $x; done
对于那些熟悉Python的人,https://github.com/Russell91/pythonpy是解决此问题的不错选择。
$ echo "a:b:c:d:e" | py -x 'x.split(":")[-1]'
来自pythonpy帮助:-x treat each row of stdin as x
。
使用该工具,很容易编写应用于输入的python代码。
尽管一个简单的解决方案是反转输入字符串的顺序,但答案可能会晚一点。无论长度如何,这都将使您始终获得最后一个项目。
[chris@desktop bin]$ echo 1:2:3:4:5 | rev | cut -d: -f1
5
但是,请务必注意,如果使用此方法并且数字大于1位(或在任何情况下均大于一个字符),则将需要在管道输出上运行另一个“ rev”命令。
[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1
42
[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1 | rev
24
希望我能帮上忙
如果您喜欢python并可以选择安装软件包,则可以使用此python实用工具。
# install pythonp
pythonp -m pip install pythonp
echo "1:2:3:4:5" | pythonp "l.split(':')[-1]"
5
echo "1:2:3:4:5" | python -c "import sys; print(list(sys.stdin)[0].split(':')[-1])"
pythonp
打包的全部目的是使您做的事python -c
与减少字符键入次数相同。请查看存储库中的自述文件。
5
1:2:3:4:5:
/