2

输入-

第 576 场比赛中 X 得分 1725 和 Y 得分 6248

我想 sed 输出-

1725

6248

我的代码-

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

上面的代码输出 -

1725 和 Y 的 6248 在比赛中

4

3 回答 3

3

您可以尝试以下 sed 命令

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

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

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

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

在一个命令中:

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

希望这会有所帮助=)

于 2012-10-03T15:06:30.587 回答
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
于 2012-10-03T15:06:54.070 回答
0

你可以和两个 egreps:

<infile egrep -o 'Score [0-9]+' | egrep -o '[0-9]+$'
于 2012-10-03T17:28:37.880 回答