【问题标题】:sed - Return characters before patternsed - 在模式之前返回字符
【发布时间】:2013-08-08 08:47:09
【问题描述】:
 $  echo "ABC XYZ 12/123/52/ ABBDBDAD 562.4224.32 02381831522" | sed 's/[^a-zA-Z]//g' raw.tmp

使用上述方法,我试图从一行中提取 ABC XYZ(保留空格)。我的正则表达式返回 ABCXYZABBDBDAD:我是正则表达式的菜鸟,还有很多东西要学。

总之,如何从前面有空格的数字前的一行中获取子字符串 ABC XYZ?

【问题讨论】:

    标签: regex bash sed cygwin


    【解决方案1】:

    这样就可以了:

    $ echo "ABC XYZ 12/123/52/ ABBDBDAD 562.4224.32 02381831522" | sed -n 's/\([A-Z]* [A-Z]*\) [0-9]*.*/\1/p' 
    ABC XYZ
    

    说明:

    sed -n 's/\([A-Z]* [A-Z]*\) [0-9]*.*/\1/p' 
    
      \([A-Z]* [A-Z]*\)  == catch WORD + space + WORD
           [0-9]*.*      == some number + space + rest of string
      /\1/p              == print catched string
    

    【讨论】:

      【解决方案2】:

      也许是这个

      echo "ABC XYZ 12/123/52/ ABBDBDAD 562.4224.32 02381831522" | sed -n 's/^\([a-zA-Z ]\+\).*/\1/gp' > raw.tmp
      

      或者更准确地说

      echo "ABC XYZ 12/123/52/ ABBDBDAD 562.4224.32 02381831522" | sed -n 's/^\([a-zA-Z][a-zA-Z ]\+[a-zA-Z]\).*/\1/gp'
      

      这限制了以字母开头和以字母结尾的字符。

      【讨论】:

        【解决方案3】:

        你需要写以下内容

        echo "ABC XYZ 12/123/52/ ABBDBDAD 562.4224.32 02381831522" | sed 's/.*\(ABC XYZ\).*/\1/g'
        

        输出

        ABC XYZ

        重点是 - 我相信您正在尝试提取“ABC XYZ”(完全正确)。所以你提取它并用它替换整行

        编辑我想我没有抓住重点。你基本上想要'Str1 Str2'

        在这种情况下,以下工作

        echo "ABC XYZ 12/123/52/ ABBDBDAD 562.4224.32 02381831522" | sed 's/\([a-zA-Z ][a-zA-Z ]*\).*/\1/g'
        

        【讨论】:

          猜你喜欢
          • 2014-10-07
          • 2016-06-17
          • 2019-03-28
          • 1970-01-01
          • 2018-12-30
          • 1970-01-01
          • 1970-01-01
          • 2021-09-12
          • 1970-01-01
          相关资源
          最近更新 更多