如何使用sed从字符串中提取文本?

时间:2012-07-19 20:34:16

标签: regex bash sed

我的示例字符串如下:

This is 02G05 a test string 20-Jul-2012

现在从上面的字符串中我想要提取02G05。为此我用sed

尝试了以下正则表达式
$ echo "This is 02G05 a test string 20-Jul-2012" | sed -n '/\d+G\d+/p'

但上面的命令没有打印任何内容,我相信它的原因是它无法匹配我提供给sed的模式。

所以,我的问题是我在这里做错了什么以及如何纠正它。

当我用python尝试上面的字符串和模式时,我得到了我的结果

>>> re.findall(r'\d+G\d+',st)
['02G05']
>>>

5 个答案:

答案 0 :(得分:77)

如何使用egrep

echo "This is 02G05 a test string 20-Jul-2012" | egrep -o '[0-9]+G[0-9]+'

答案 1 :(得分:66)

\d可能不支持模式sed。请改为[0-9][[:digit:]]

要仅打印实际匹配(而不是整个匹配行),请使用替换。

sed -n 's/.*\([0-9][0-9]*G[0-9][0-9]*\).*/\1/p'

答案 2 :(得分:4)

sed无法识别\d,而是使用[[:digit:]]。您还需要转义+或使用操作系统X上的-r开关(-E)。

请注意,[0-9]也适用于阿拉伯语 - 印度数字。

答案 3 :(得分:4)

请改为尝试:

echo "This is 02G05 a test string 20-Jul-2012" | sed 's/.* \([0-9]\+G[0-9]\+\) .*/\1/'

但请注意,如果一行上有两个模式,它将打印第二个。

答案 4 :(得分:0)

尝试使用rextract。它将允许您使用正则表达式提取文本并重新格式化。

示例:

$ echo "This is 02G05 a test string 20-Jul-2012" | ./rextract '([\d]+G[\d]+)' '${1}'

2G05