Sed - 在匹配不止一次的行中打印图案

时间:2012-10-03 14:50:05

标签: sed

输入 -

  

X的得分为1725,Y的得分为6248,匹配数为576

我想要sed输出 -

  

1725

     

6248

我的代码 -

sed 's/Score[[:space:]]\([0-9]+\)/\1/g'

以上代码输出 -

  

1725和Y的6248在比赛中

3 个答案:

答案 0 :(得分:3)

您可以尝试以下sed命令

#!/bin/sed f
s/Score\s*/\
/g
s/\n\([0-9]\+\)[^\n]*/\
\1/g
s/^[^\n]*\n//

第一个命令用换行符替换所有“得分”,所以现在所有数字都在一行的开头。要插入换行符,我们必须写一个反斜杠后跟一个实际的换行符。这就是命令产生两行的原因。

第二个命令将删除行开头的数字后面的所有内容。它将匹配换行符后跟一个数字(这就是我们现在这个数字以“得分”字符串作为前缀的方式)。该数字将被捕获到变量\1中。然后它将跳过所有字符直到换行符。在编写替换时,我们必须将换行符和捕获的数字恢复为\1

因为第一行包含第一个“得分”之前的文本,所以我们必须删除它。这就是最后一个命令所做的,它匹配所有字符直到第一个换行符,从模式空间的内容开始(即我们的工作缓冲区)开始。

在一个命令中:

sed -e 's/Score\s*/\
/g;s/\n\([0-9]\+\)[^\n]*/\
\1/g;s/^[^\n]*\n//'

希望这有助于=)

答案 1 :(得分:2)

使用GNU sed的一种方法是因为\b与字边界匹配是一种扩展。

echo "X's Score 1725 and Y's Score 6248 in the match number 576" | sed -e '
    ## Surround searched numbers (preceded by "Score") with newline characters.
    s/\bScore \([0-9]\+\)\b/\n\1\n/g;
    ## Delete all numbers not preceded by a newline character.
    s/\([^\n0-9]\)[0-9]\+/\1/g;
    ## Remove all other characters but numbers and newlines.
    s/[^0-9\n]\+//g;
    ## Remove extra newlines.
    s/\n\([0-9]\)/\1/g; 
    s/\n$//
' infile

它产生:

1725
6248

答案 2 :(得分:0)

你可以和两个白鹭:

<infile egrep -o 'Score [0-9]+' | egrep -o '[0-9]+$'