我的示例字符串如下:
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']
>>>
答案 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