【问题标题】:Extracting A String Between Two Characters in Bash [closed]在 Bash 中提取两个字符之间的字符串 [关闭]
【发布时间】:2014-02-05 20:36:50
【问题描述】:

我需要帮助我在 Bash 中提取“@”符号和空格“”之间的字符串。

我用的是Python Twitter Tools,输出是这样的:

430438229200740352 2014-02-03 14:30:45 CST <HorizonAwon> @SawBlastt @WereAutomatic 101 for me to join as well

我需要提取两个字符串:

SawBlastt

是自动的

我还需要将它们分别设置为单独的变量。我尝试过使用 sed 和 grep,但没有成功的结果。我真的坚持这一点。非常感谢帮助。谢谢!

【问题讨论】:

    标签: regex linux bash sed grep


    【解决方案1】:

    你可以使用:

    s='430438229200740352 2014-02-03 14:30:45 CST <HorizonAwon> @SawBlastt @WereAutomatic 101 for me to join as well'
    grep -oP '@\K[^ ]*' <<< "$s"
    SawBlastt
    WereAutomatic
    

    【讨论】:

    • 非常感谢。它正在工作:D
    • 不客气,很高兴它成功了。
    • 既然你用的是-P,不如用\w+代替[^ ]*
    • 是的,当然也可以使用,但我不确定@" "之间是否会出现点或连字符
    • +1;对于那些(像我一样)不熟悉\K 的人:这个 Perl[-style] 正则表达式功能(由于-P grep 选项而可用)导致到目前为止匹配的字符串被删除,因此是一个更简单的替代后视表达式(在本例中为 grep -oP '(?&lt;=@)[^ ]*')。
    【解决方案2】:

    另一个 gnu grep 命令,我经常使用。

    grep -Po "(?<=@)[^ ]*" file
    

    【讨论】:

      【解决方案3】:

      BASH 有自己的正则表达式匹配功能,可以使用。

      s="430438229200740352 2014-02-03 14:30:45 CST <HorizonAwon> @SawBlastt @WereAutomatic 101 for me to join as well"
      if [[ $s =~ @([A-Za-z]+)\ @([A-Za-z]+) ]]; then
          echo ${BASH_REMATCH[1]} ${BASH_REMATCH[2]}
      fi
      

      解释一下,man bash 是这样说的:

      索引为 n 的 BASH_REMATCH 元素是字符串中匹配第 n 个带括号的子表达式的部分。

      【讨论】:

        【解决方案4】:

        这会设置像 OP 请求的变量

        $ cat foo.txt
        430438229200740352 2014-02-03 14:30:45 CST <HorizonAwon> @SawBlastt @WereAutomatic 101 for me to join as well
        
        $ set $(awk '{print $6,$7}' FS='[ @]+' foo.txt)
        
        $ echo $1 $2
        SawBlastt WereAutomatic
        

        【讨论】:

          猜你喜欢
          • 2014-02-26
          • 2020-10-15
          • 2012-07-07
          • 1970-01-01
          • 2013-05-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多