【问题标题】:How can I extract the last field in a string?如何提取字符串中的最后一个字段?
【发布时间】:2017-02-05 17:31:55
【问题描述】:

如何提取字符串中的最后一个字段?我有一个字符串:

xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1

我要提取字符串的最后一部分,即VGA1

【问题讨论】:

    标签: bash


    【解决方案1】:

    如果字符串有分隔符,您可以使用revcut,如您的情况:

    var="xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1"
    rev <<< "$var" | cut -f1 -d' ' | rev
    # output => VGA1
    
    • 第一个 rev 反转字符串,以便最后一个标记移到开头,尽管是反向的
    • cut -f1 提取第一个字段,使用空格作为分隔符
    • 第二个rev 将提取的字段反转为其原始状态

    这个解决方案的好处是它不依赖于最后一个标记之前有多少字段。


    相关帖子:How to find the last field using 'cut'

    【讨论】:

      【解决方案2】:

      如果这个字符串总是包含相同数量的空格,我们可以将每个空格分隔的部分视为一个字段,并使用cut 提取它:

      $ echo "xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1" | cut -d' ' -f7
      VGA1
      

      如果不是这样,我们可以使用正则表达式从末尾匹配,例如grep

      $ echo "xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1" | grep -o '[^ ]*$'
      VGA1
      

      【讨论】:

        【解决方案3】:

        仅使用 Bash 内置函数的一种方法(无外部命令):

        var="xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1"
        [[ "$var" =~ [[:space:]]([^[:space:]]+)([[:space:]]*)$ ]]
        match="${BASH_REMATCH[1]-}"
        

        请注意,使用的正则表达式将允许字符串中的尾随空格;如果将其视为错误而不是功能,则可以对其进行简化以避免这种情况:

        [[ "$var" =~ [[:space:]]([^[:space:]]+)$ ]]
        

        【讨论】:

          【解决方案4】:

          我采取了不同的方法:

          echo "xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1" | \
          sed 's/ /\
          /g' | tail -n1
          

          【讨论】:

            【解决方案5】:

            我会使用 awk:

            $ awk '{print $NF}' <<< 'xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1'
            VGA1
            

            NF是记录中的字段数,$NF打印编号为NF的字段,即最后一个。默认情况下,字段以空格分隔。

            或者,使用 shell 参数扩展:

            $ str='xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1'
            $ echo "${str##* }"
            VGA1
            

            这会从开头删除最长的匹配字符串,其中要匹配的模式是* :“任何内容,后跟一个空格”。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-07-07
              • 2011-08-17
              • 2013-03-31
              • 2017-12-28
              • 1970-01-01
              • 2021-10-14
              相关资源
              最近更新 更多