Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何在bash中提取字符串的最后一部分?_String_Bash_Awk - Fatal编程技术网

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命令切掉部分行,使用一个简单的空格作为单词分隔符。如何知道值从何处开始?如果总是第5和第6个单词,您可以使用例如: B=$(echo $A | cut -d ' ' -f 5-) 这将使

我有一个变量:

A="Some variable has value abc.123"

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

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

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

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

如何知道值从何处开始?如果总是第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}
符号)。

是;这:

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
组合将输出字符串中的最后一个字段,无论字符串包含多少字段。

最简单

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
“”空间上的最短匹配


阅读更多

一些使用参数展开的示例

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
    • 这本书读起来有点痛苦,所以我用一种更简单的方式总结了它

      请注意,“
      *
      ”需要与“
      ”交换位置,具体取决于您是使用
      还是
      %
      。(由于
      *
      只是一个通配符,因此您可能需要在阅读时摘掉“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
        

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

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

        这是命令行的最佳答案,我想知道为什么它不是更流行的“print NF”打印字数,$NF是最后一个字。这是命令行的最佳答案,我想知道为什么它不是更流行的“print NF”打印字数,$NF是最后一个字。谢谢!我到处寻找从字段x到字符串末尾的方法,但找不出
        -f
        字段列表的通配符,然后偶然发现这里使用了
        -
        。我想是看了BSD下的
        cut
        手册页面后得到的。谢谢!我到处寻找从字段x到字符串末尾的方法,但找不出通配符f