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
周围的方括号是完全多余的。