输入 -
X的得分为1725,Y的得分为6248,匹配数为576
我想要sed输出 -
1725
6248
我的代码 -
sed 's/Score[[:space:]]\([0-9]+\)/\1/g'
以上代码输出 -
1725和Y的6248在比赛中
答案 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]+$'