【问题标题】: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'