112

我的示例字符串如下:

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']
>>>
4

5 回答 5

118

怎么用grep -E

echo "This is 02G05 a test string 20-Jul-2012" | grep -Eo '[0-9]+G[0-9]+'
于 2012-07-19T20:42:43.843 回答
116

\dsed. 尝试[0-9][[:digit:]]代替。

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

sed -n 's/.*\([0-9][0-9]*G[0-9][0-9]*\).*/\1/p'
于 2012-07-19T20:39:57.473 回答
6

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

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

于 2012-07-19T20:37:52.847 回答
5

试试这个:

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

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

于 2012-07-19T20:40:07.053 回答
-1

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

例子:

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

2G05
于 2016-09-13T03:03:35.520 回答