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

Regex 如何使用sed从字符串中提取文本?,regex,bash,sed,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尝试上面的字符串

我的示例字符串如下所示:

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

sed
无法识别
\d
,请改用
[[:digit:]
。您还需要退出
+
或使用
-r
开关(OSX上的
-E


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

您的
sed
可能不支持模式
\d
。请尝试
[0-9]
[:digit:]

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

sed -n 's/.*\([0-9][0-9]*G[0-9][0-9]*\).*/\1/p'
请尝试以下方法:

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

我试过
sed-n'/[0-9]\+G[0-9]\+/p'
。现在它只打印整个string@Noob:您将需要使用替换。谢谢,它工作得很好。但是我有一个问题,为什么你的正则表达式需要
*
,因为当我尝试
sed-n的/\([0-9]\+G[0-9]\+\)/\1/p'
时,它只会打印整行。这就是为什么,不是吗?用norhing替换比赛前后的内容,然后打印整行。@tripleee这只打印
2G05
而不是
02G05
。有效的表达式是
的s/*\([0-9][0-9]G[0-9][0-9]*\)./\1/p'
,它将其硬编码为正好两位数字。类似于
sed-n的/\(.[^0-9]\)?\([0-9][0-9]*G[0-9][0-9]*\)./\2/p'
更为一般。(我假设您的
sed
支持零次或一次出现的
\?
)另请参阅,以了解如何替换其他各种常见的Perl转义,如
\w
\s
,等等。+1这更简单,并且还将正确处理同一行上的多个匹配的情况。对于这种情况,可以设计一个复杂的
sed
脚本,但是为什么呢?
egrep
使用扩展的regexp,
sed
grep
使用标准的regexp,
egrep
grep-e
使用扩展的regexp,问题中的python代码使用PCRE(perl公共正则表达式)GNU grep可以将PCRE与
-P
选项一起使用。@FelipeBuccioni实际上应该是
egrep
grep-E
sed-r
对于单个(第一个)匹配,附加“| head-1”(无反勾),根据另一个问题。
grep
在第一次匹配后停止
-m1
。Python肯定不是
sed
。它们的正则表达式风格完全不同。如果有多个匹配项,通常是最后一个。如果使用标准正则表达式,
\d
周围的方括号是完全多余的。