String 如何在bash中提取字符串的最后一部分?

String 如何在bash中提取字符串的最后一部分?,string,bash,awk,String,Bash,Awk,我有一个变量: A="Some variable has value abc.123" 我需要提取此值,即abc.123。这在bash中可能吗?如何知道值从何处开始?如果总是第5和第6个单词,您可以使用例如: B=$(echo $A | cut -d ' ' -f 5-) 这将使用cut命令切掉部分行,使用简单的空格作为单词分隔符。是;这: A="Some variable has value abc.123" echo "${A##* }" 将打印以下内容: abc.

我有一个变量:

A="Some variable has value abc.123"

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

如何知道值从何处开始?如果总是第5和第6个单词,您可以使用例如:

B=$(echo $A | cut -d ' ' -f 5-)
这将使用
cut
命令切掉部分行,使用简单的空格作为单词分隔符。

是;这:

A="Some variable has value abc.123"
echo "${A##* }"
将打印以下内容:

abc.123 abc.123 (中解释了
${parameter###word}
符号)。

最简单的是

echo $A | awk '{print $NF}'
编辑:这是如何工作的解释

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

echo $A | awk '{print $5}'
NF
是一个内置的
awk
变量,它给出当前记录中的字段总数。以下返回数字5,因为字符串
中有5个字段“某些变量的值为abc.123”


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

使用参数展开的一些示例

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

abc.123
“”空间上的最长匹配

世界上最长的比赛。圆点

echo "${A%.*}"

Some variable has value abc
“”空间上的最短匹配

阅读更多

这本书读起来有点痛苦,所以我用一种更简单的方式总结了它

请注意,“
*
”需要与“
”交换位置,具体取决于您是使用
还是
%
。(由于
*
只是一个通配符,因此您可能需要在阅读时摘掉“regex帽子”。)

  • ${A%*}
    -删除最短尾随
    *
    (去掉最后一个单词)
  • ${A%%*}
    -删除最长的尾随
    *
    (去掉最后的单词)
  • ${A#*}
    -删除最短的前导
    *
    (去掉第一个单词)
  • ${A###*}
    -删除最长的前导
    *
    (去掉第一个单词)
当然,这里的“单词”可能包含任何非文字空间的字符

您通常可以使用以下语法来修剪文件名:

  • ${A##*/}
    删除所有包含文件夹(例如
    /usr/bin/git
    ->
    git
  • ${A%.*}
    删除最后一个扩展名(例如
    archive.tar.gz
    ->
    archive.tar
    )-请注意
    my.path/noext

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

    A="Some variable has value abc.123"
    
    echo $A | rev | cut -d ' ' -f 1 | rev                                                                                            
    
    # abc.123
    

    这是命令行的最佳答案,我想知道为什么它不是更流行的“print NF”打印字数,$NF是最后一个字。谢谢!我到处寻找从字段x到字符串末尾的方法,但找不出
    -f
    字段列表的通配符,然后偶然发现这里使用了
    -
    。我想我在BSD下查看
    cut
    的手册页面会得到什么。
    echo "${A%.*}"
    
    Some variable has value abc
    
    echo "${A%% *}"
    
    some
    
    A="Some variable has value abc.123"
    
    echo $A | rev | cut -d ' ' -f 1 | rev                                                                                            
    
    # abc.123