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

Ran*_*Rag 83 regex bash sed

我的示例字符串如下:

This is 02G05 a test string 20-Jul-2012
Run Code Online (Sandbox Code Playgroud)

现在从我想要提取的上面的字符串02G05.为此我用sed尝试了以下正则表达式

$ echo "This is 02G05 a test string 20-Jul-2012" | sed -n '/\d+G\d+/p'
Run Code Online (Sandbox Code Playgroud)

但上面的命令没有打印任何东西,我相信它的原因是它无法匹配我提供给sed的模式.

所以,我的问题是我在这里做错了什么以及如何纠正它.

当我用python尝试上面的字符串和模式时,我得到了我的结果

>>> re.findall(r'\d+G\d+',st)
['02G05']
>>>
Run Code Online (Sandbox Code Playgroud)

mVC*_*Chr 85

怎么用egrep

echo "This is 02G05 a test string 20-Jul-2012" | egrep -o '[0-9]+G[0-9]+'
Run Code Online (Sandbox Code Playgroud)

  • +1这更简单,并且还可以正确处理同一行上多个匹配的情况.可以为这种情况设计一个复杂的"sed"脚本,但为什么要这么麻烦? (3认同)
  • `grep` 有 `-m 1` 在第一场比赛后停止。 (2认同)

tri*_*eee 78

\d您可能不支持该模式sed.尝试[0-9][[:digit:]]改为.

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

sed -n 's/.*\([0-9][0-9]*G[0-9][0-9]*\).*/\1/p'
Run Code Online (Sandbox Code Playgroud)

  • 那就是原因,不是吗?用norhing替换匹配前后的任何内容,然后打印整行. (6认同)
  • 谢谢它工作得很好.但我有一个问题为什么`.*`是你的正则表达式所必需的,因为当我尝试`sed -n's/\([0-9]\+ G [0-9]\+ \)/\1/p时''它只打印整条线. (5认同)

Pau*_*ce. 5

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

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


Zso*_*kai 5

尝试以下方法:

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

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