输入-
第 576 场比赛中 X 得分 1725 和 Y 得分 6248
我想 sed 输出-
1725
6248
我的代码-
sed 's/Score[[:space:]]\([0-9]+\)/\1/g'
上面的代码输出 -
1725 和 Y 的 6248 在比赛中
输入-
第 576 场比赛中 X 得分 1725 和 Y 得分 6248
我想 sed 输出-
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”,所以现在所有数字都在一行的开头。要插入换行符,我们必须写一个反斜杠,后跟一个实际的换行符。这就是该命令产生两行的原因。
第二个命令将删除行首数字之后的所有内容。它将匹配一个后跟一个数字的换行符(这就是我们现在这个数字以“Score”字符串为前缀的方式)。该数字将被捕获到变量\1
中。然后它将跳过所有字符直到换行符。在编写替换时,我们必须将换行符和捕获的数字恢复到\1
.
因为第一行包含第一个“Score”之前的文本,我们必须删除它。这就是最后一个命令的作用,它匹配所有字符直到第一个换行符,从模式空间内容的开头(即我们的工作缓冲区)开始。
在一个命令中:
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
你可以和两个 egreps:
<infile egrep -o 'Score [0-9]+' | egrep -o '[0-9]+$'