49

我有这个变量:

A="Some variable has value abc.123"

我需要提取这个值,即abc.123。这在bash中可能吗?

4

6 回答 6

130

最简单的是

echo $A | awk '{print $NF}'

编辑:解释这是如何工作的......

awk将输入分成不同的字段,默认使用空格作为分隔符。硬编码5代替NF打印输入中的第 5 个字段:

echo $A | awk '{print $5}'

NF是一个内置awk变量,它给出当前记录中的字段总数。以下返回数字 5,因为字符串中有 5 个字段"Some variable has value abc.123"

echo $A | awk '{print NF}'

结合输出字符串$NF的最后一个字段,无论您的字符串包含多少个字段。

于 2012-09-14T14:38:46.663 回答
58

是的; 这个:

A="Some variable has value abc.123"
echo "${A##* }"

将打印:

abc.123

(该符号在Bash 参考手册的第 3.5.3 节“Shell 参数扩展”中进行了解释。)${parameter##word}

于 2012-09-14T14:38:46.063 回答
17

使用参数扩展的一些示例

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

阅读更多外壳参数扩展

于 2012-11-21T05:00:31.357 回答
15

你怎么知道价值从哪里开始?如果总是第 5 个和第 6 个单词,您可以使用例如:

B=$(echo $A | cut -d ' ' -f 5-)

这使用cut命令切出部分行,使用简单的空格作为单词分隔符。

于 2012-09-14T14:37:35.770 回答
11

文档阅读起来有点痛苦,因此我以更简单的方式对其进行了总结。

请注意,“ *”需要与“”交换位置, 具体取决于您使用#%。(这*只是一个通配符,因此您可能需要在阅读时摘下“正则表达式帽子”。)

  • ${A% *}- 删除最短的尾随 *(去掉最后一个字
  • ${A%% *}- 删除最长的尾随 *(去掉最后的话
  • ${A#* }- 删除最短的前导* (去掉第一个单词
  • ${A##* }- 删除最长的前导* (去掉第一个单词

当然,这里的“单词”可能包含任何不是文字空间的字符。

您可能通常使用此语法来修剪文件名:

  • ${A##*/}删除所有包含的文件夹(例如/usr/bin/git-> git
  • ${A%.*}删除最后一个扩展名(例如archive.tar.gz-> archive.tar) - 请注意以下内容my.path/noext
于 2020-01-07T13:06:48.910 回答
1

正如 Zedfoxus在这里指出的那样。一种非常干净的方法,适用于所有基于 Unix 的系统。此外,您不需要知道子字符串的确切位置。

A="Some variable has value abc.123"

echo $A | rev | cut -d ' ' -f 1 | rev                                                                                            

# abc.123
于 2020-10-02T08:46:07.610 回答