sed - 在模式之前返回字符

时间:2013-08-08 08:47:09

标签: regex bash sed cygwin

 $  echo "ABC XYZ 12/123/52/ ABBDBDAD 562.4224.32 02381831522" | sed 's/[^a-zA-Z]//g' raw.tmp

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

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

3 个答案:

答案 0 :(得分:2)

这可以做到:

$ 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

答案 1 :(得分:1)

也许这一个

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'

它限制以字母开头并以字母结尾的字符。

答案 2 :(得分:0)

你需要写下面的

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'