Sed-在一条匹配多次的线中打印图案

Sed-在一条匹配多次的线中打印图案,sed,Sed,输入- 在576号比赛中,X的得分为1725,Y的得分为6248 我想让塞德离开- 1725年 6248 我的代码- sed 's/Score[[:space:]]\([0-9]+\)/\1/g' 上述代码输出- 1725和Y在比赛中得分6248 您可以尝试以下sed命令 #!/bin/sed f s/Score\s*/\ /g s/\n\([0-9]\+\)[^\n]*/\ \1/g s/^[^\n]*\n// 第一个命令将所有“分数”替换为换行符,因此现在所有数字都位于一行的开头。要插入

输入-

在576号比赛中,X的得分为1725,Y的得分为6248

我想让塞德离开-

1725年

6248

我的代码-

sed 's/Score[[:space:]]\([0-9]+\)/\1/g'
上述代码输出-

1725和Y在比赛中得分6248


您可以尝试以下sed命令

#!/bin/sed f
s/Score\s*/\
/g
s/\n\([0-9]\+\)[^\n]*/\
\1/g
s/^[^\n]*\n//
第一个命令将所有“分数”替换为换行符,因此现在所有数字都位于一行的开头。要插入换行符,我们必须写一个反斜杠,后跟一个实际的换行符。这就是命令生成两行代码的原因

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

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

在单个命令中:

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

希望这有助于=)

单向使用
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

你可以和两只白鹭:

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

我不只是想要任何数字,而是数字后跟关键字分数,甚至我不确定输入中可以有多少个模式我不只是想要任何数字,而是数字后跟关键字分数,甚至我不确定输入中可以有多少个模式