【问题标题】:How to extract the first word that follows a string?如何提取字符串后面的第一个单词?
【发布时间】:2011-04-02 18:26:21
【问题描述】:

例如,假设我有一个文本文件 example.txt,内容如下: 我喜欢狗。 我最喜欢的狗是乔治,因为他是我的狗。 乔治是条好狗。

现在我如何提取“乔治”,因为它是“我最喜欢的狗是”之后的第一个词?

如果有多个空格怎么办,例如 我最喜欢的狗是乔治.....

无论“我最喜欢的狗是”和“乔治”之间有多少空格,有没有办法可靠地提取“乔治”这个词?

【问题讨论】:

    标签: string parsing bash


    【解决方案1】:

    如果您尝试搜索文件,尤其是当您有一个大文件时,使用 sed/awk/perl 等外部工具比使用纯 bash 循环和 bash 字符串操作要快。

    sed 's/.*HEAT OF FOMATION[ \t]*\(.[^ \t]*\).*/\1/'  file
    

    纯 bash 字符串操作仅在您处理脚本中的一些简单字符串时才有用。就像操作变量一样。

    【讨论】:

      【解决方案2】:

      纯猛击:

      string='blah blah ! HEAT OF FORMATION 105.14088 93.45997 46.89387 blah blah'
      pattern='HEAT OF FORMATION ([^[:blank:]]*)'
      [[ $string =~ $pattern ]]
      match=${BASH_REMATCH[1]}
      

      【讨论】:

        【解决方案3】:

        如果你没有安装 perl,你可以使用 sed:

        cat example.txt | sed 's/my favourite dog is *\([a-zA-Z]*\) .*/\1/g'
        

        【讨论】:

        • 谢谢。我可以问一下,使用 bash (sed)、pearl 还是其他方式最快?
        • 我不确定,但我猜由于启动速度更快,对于较小的文件,sed 比 perl 更快。对于更大的文件,我不知道。
        • @Feynman: sed 与 Bash 没有任何关系,反之亦然,除了 sed 是一个可以由 shell 生成的程序而 Bash 是一个 shell。但是,您可以使用 Bash 进行字符串提取(请参阅我的回答)。
        【解决方案4】:

        你可以这样做:

        cat example.txt | perl -pe 's/My favorite dog is\s+(\w+).*/\1/g'
        

        它输出Geroge

        【讨论】:

        • 谢谢!如果我想从 blah blah 中提取 105.15088 怎么办!形成热 105.14088 93.45997 46.89387 blah blah
        • 你可以试试cat input | perl -pe 's/blah blah ! HEAT OF FORMATION\s+(\S+)\s.*/\1/g'
        • cat 的无用使用(两次)。
        猜你喜欢
        • 2017-05-04
        • 1970-01-01
        • 1970-01-01
        • 2015-05-08
        • 2022-12-18
        • 2012-11-24
        • 2021-12-27
        • 2013-09-21
        • 2013-09-04
        相关资源
        最近更新 更多