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

yqkkidmi  于 2023-03-20  发布在  其他
关注(0)|答案(6)|浏览(217)

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

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

rlcwz9us1#

使用grep -E怎么样?

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

tvz2xvvm2#

您的sed可能不支持模式\d。请尝试[0-9][[:digit:]]
若要仅打印实际匹配项(而不是整个匹配行),请使用替换。

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

4bbkushb3#

试试这个:

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

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

qni6mghb

qni6mghb4#

sed无法识别\d,请改用[[:digit:]]。您还需要转义+或使用-r开关(OS X上为-E)。
请注意,[0-9]同样适用于阿拉伯-印度数字。

cgh8pdjw

cgh8pdjw5#

我们可以使用sed -En来简化正则表达式,其中:

n: suppress automatic printing of pattern space
E: use extended regular expressions in the script
$ echo "This is 02G05 a test string 20-Jul-2012" | sed -En 's/.*([0-9][0-9]+G[0-9]+).*/\1/p'

02G05
7gcisfzg

7gcisfzg6#

尝试使用rextract,它允许你使用正则表达式提取文本并重新格式化。
示例:

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

2G05

相关问题