【问题标题】:Extract the two first words of a string in bash在bash中提取字符串的前两个单词
【发布时间】:2016-04-20 07:58:39
【问题描述】:

我有一个字符串,里面有一个句子 like a="hello my dear friend"。我想检索前两个单词(这里应该是“hello my”),知道单词的数量可能会有所不同。我试过${a%% *},但它只给了我第一个。

在同一种情况下,我需要提取没有前两个单词的整个句子。我该怎么做?

【问题讨论】:

    标签: string bash extract


    【解决方案1】:

    您可以使用正则表达式来捕获您想要的文本部分:

    $ a="hello my dear friend"
    $ [[ $a =~ ^([^ ]+ [^ ]+)\ ?(.*) ]]
    $ echo "${BASH_REMATCH[1]}"
    hello my
    $ echo "${BASH_REMATCH[2]}"
    dear friend
    

    Bash 的 extglob 功能也可以使用,使用匹配的表达式作为排除项:

    $ shopt -s extglob
    $ a="hello my dear friend. would you like a beer?"
    $ b="${a#+(!( )) +(!( )) }"
    $ echo "$b"
    dear friend. would you like a beer?
    $ echo "${a%$b}"
    hello my
    

    或者从字符串的另一端:

    $ c="${a% +(!( )) +(!( ))}"
    $ echo "$c"
    hello my dear friend. would you like
    $ echo "${a#$c}"
     a beer?
    

    【讨论】:

      【解决方案2】:

      Shell 函数在任何 Bourne shell 或更高版本中都适用于此:

      $ f2 () { echo "$1" "$2" }
      $ frest () { shift; shift; echo "$*" }
      
      $ a="hello my dear friend"
      
      $ f2 $a
      hello my
      
      $ frest $a
      dear friend
      

      【讨论】:

        【解决方案3】:

        您可以将字符串读入数组并使用切片:

        $ read -ra words <<<"$a" && echo "${words[@]:2}"
        dear friend
        

        以另一个进程为代价,你也可以使用cut

        $ cut -d' ' -f3- <<<"$a"
        dear friend
        

        这种行为略有不同,因为它在单个空格上拆分,而使用 read 的方法将占用每个单词之间的任意数量的空格。

        【讨论】:

          【解决方案4】:

          您可以为此使用 BASH 数组:

          # construct an array delimited by whitespace
          a="hello my dear friend"
          arr=($a)
          
          # first two words
          echo "${arr[@]:0:2}"
          hello my
          
          # anything after first 2 words
          echo "${arr[@]:2}"
          dear friend
          

          【讨论】:

          • 这种方法的一个缺点是您不能在字符串中保留空格。
          • 是的,但由于 OP 说前 2 个“单词”,单词不能有空格
          • 是的,就我而言,这个解决方案似乎更好。但是感谢您提供有关空格的提示。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-13
          • 2014-05-28
          • 2021-10-14
          • 2013-12-12
          • 2012-07-07
          • 2020-10-15
          相关资源
          最近更新 更多