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

我的示例字符串如下:

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

现在,我想从上面的字符串中提取 02G05

$ echo "This is 02G05 a test string 20-Jul-2012" | sed -n '/\d+G\d+/p'

但是上面的命令什么也打印不出来,原因是它无法与我提供给 sed 的模式匹配。

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

When I try the above string and pattern with python I get my result

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

sed不识别 \d,而是使用 [[:digit:]]。您还需要转义 +或使用 -r开关(在 OS X 上为 -E)。

Note that [0-9] works as well for Arabic-Hindu numerals.

The pattern \d might not be supported by your sed. Try [0-9] or [[:digit:]] instead.

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

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

Try this instead:

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

但是请注意,如果有两个图案在一条线上,它将打印第二个。

使用 grep -E怎么样?

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

尝试使用 收回。它将让您提取文本使用正则表达式和重新格式化。

例如:

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


2G05