我有变量:
A="Some variable has value abc.123"
我需要提取这个值,即abc.123
。在bash中这可能吗?
答案 0 :(得分:68)
最简单的是
echo $A | awk '{print $NF}'
编辑:解释其工作原理......
awk
将输入分为不同的字段,默认情况下使用空格作为分隔符。硬编码5
代替NF
打印出输入中的第5个字段:
echo $A | awk '{print $5}'
NF
是一个内置的awk
变量,它给出了当前记录中的字段总数。以下返回数字5,因为字符串"Some variable has value abc.123"
中有5个字段:
echo $A | awk '{print NF}'
将$
和NF
组合在一起输出字符串中的最后一个字段,无论字符串包含多少字段。
答案 1 :(得分:31)
是;这样:
A="Some variable has value abc.123"
echo "${A##* }"
将打印出来:
abc.123
(§3.5.3 "Shell Parameter Expansion" of the Bash Reference Manual中解释了${parameter##word}
表示法。)
答案 2 :(得分:9)
使用参数扩展的一些示例
A="Some variable has value abc.123"
echo "${A##* }"
abc.123
“”空间
的最长匹配echo "${A% *}"
Some variable has value
最长的比赛。点
echo "${A%.*}"
Some variable has value abc
“”空间最短匹配
echo "${A%% *}"
some
答案 3 :(得分:8)
你怎么知道价值从哪里开始?如果它总是第5和第6个单词,你可以使用例如:
B=$(echo $A | cut -d ' ' -f 5-)
这使用cut
命令切出部分行,使用简单空格作为单词分隔符。
答案 4 :(得分:5)
JSR223 Test Elements读起来有点痛苦,所以我以一种更简单的方式对其进行了总结。
请注意,取决于您使用*
还是,“
#
”需要与“ %
”交换位置。 (*
只是一个通配符,因此您在阅读时可能需要摘下“ regex帽子”。)
${A%% *}
-删除最长的结尾 *
(仅保留第一个单词)${A% *}
-删除结尾最短的 *
(保留除最后一个单词外的所有)${A##* }
-删除最长的前导*
(仅保留姓氏)${A#* }
-删除最短的前导*
(保留除第一个单词外的所有字符)当然这里的“单词”可以包含不是文字空间的任何字符。
答案 5 :(得分:1)
如Zedfoxus here所指出。在所有基于Unix的系统上都可以使用的非常干净的方法。此外,您不需要知道子字符串的确切位置。
A="Some variable has value abc.123"
echo $A | rev | cut -d ' ' -f 1 | rev
# abc.123