Regex 在模式之前提取数字

Regex 在模式之前提取数字,regex,bash,awk,sed,grep,Regex,Bash,Awk,Sed,Grep,我有一个包含如下序列的文件(一个用于国际象棋记法的PGN文件,如果你想知道的话): 请注意,它被分成了几行。现在,从这个不断更新的文件中,我想提取最后一个点之前的数字,在本例中是31 我已设法仅提取最后一行,并删除可能的空行,包括: sed '/^ *$/d' thefile.pgn | tail -1 然而,我不知道如何捕捉点之前的最后一个数字。是否有一个工具(awk、sed、grep、whathaveyou)可以完成这项工作?如果文件只包含一行,您可以使用sed: $ sed -r 's/

我有一个包含如下序列的文件(一个用于国际象棋记法的PGN文件,如果你想知道的话):

请注意,它被分成了几行。现在,从这个不断更新的文件中,我想提取最后一个点之前的数字,在本例中是
31

我已设法仅提取最后一行,并删除可能的空行,包括:

sed '/^ *$/d' thefile.pgn | tail -1

然而,我不知道如何捕捉点之前的最后一个数字。是否有一个工具(awk、sed、grep、whathaveyou)可以完成这项工作?

如果文件只包含一行,您可以使用
sed

$ sed -r 's/.* ([0-9]+)\. \w+$/\1/' file
31
这将匹配所有行,并捕获行尾之前的最后一个数字块。然后,它用
\1
将其打印回来

如果文件包含许多行,那么让我们转到
grep

grep -Po " \K[0-9]+(?=\.)" file
有了这个,你可以在不同的行中得到所有的数字。要获取最后一行,只需通过管道连接到
tail-1

$ grep -Po " \K[0-9]+(?=\.)" file | tail -1
31

它的工作原理是匹配出现在点之前的所有数字。当我们使用
-o
时,每个匹配都打印在不同的行中,因此使用
tail-1
来获取最后一行。

如果文件仅包含一行,则可以使用
sed

$ sed -r 's/.* ([0-9]+)\. \w+$/\1/' file
31
这将匹配所有行,并捕获行尾之前的最后一个数字块。然后,它用
\1
将其打印回来

如果文件包含许多行,那么让我们转到
grep

grep -Po " \K[0-9]+(?=\.)" file
有了这个,你可以在不同的行中得到所有的数字。要获取最后一行,只需通过管道连接到
tail-1

$ grep -Po " \K[0-9]+(?=\.)" file | tail -1
31

它的工作原理是匹配出现在点之前的所有数字。当我们使用
-o
时,每个匹配都打印在不同的行中,因此使用
tail-1
来获取最后一行。

如果文件仅包含一行,则可以使用
sed

$ sed -r 's/.* ([0-9]+)\. \w+$/\1/' file
31
这将匹配所有行,并捕获行尾之前的最后一个数字块。然后,它用
\1
将其打印回来

如果文件包含许多行,那么让我们转到
grep

grep -Po " \K[0-9]+(?=\.)" file
有了这个,你可以在不同的行中得到所有的数字。要获取最后一行,只需通过管道连接到
tail-1

$ grep -Po " \K[0-9]+(?=\.)" file | tail -1
31

它的工作原理是匹配出现在点之前的所有数字。当我们使用
-o
时,每个匹配都打印在不同的行中,因此使用
tail-1
来获取最后一行。

如果文件仅包含一行,则可以使用
sed

$ sed -r 's/.* ([0-9]+)\. \w+$/\1/' file
31
这将匹配所有行,并捕获行尾之前的最后一个数字块。然后,它用
\1
将其打印回来

如果文件包含许多行,那么让我们转到
grep

grep -Po " \K[0-9]+(?=\.)" file
有了这个,你可以在不同的行中得到所有的数字。要获取最后一行,只需通过管道连接到
tail-1

$ grep -Po " \K[0-9]+(?=\.)" file | tail -1
31

它的工作原理是匹配出现在点之前的所有数字。当我们使用
-o
时,每个匹配项都打印在不同的行中,因此使用
tail-1
获得最后一个匹配项。

您的
sed
脚本可以很容易地扩展到
tail
grep
部分。(使用
sed-n
和控制打印的正则表达式,甚至不再需要删除空行。)

这是假设最后一行从不为空。适应这种额外的要求也不难。下面是一个稍微复杂的版本,它可以做到这一点:

sed -n '/^.* \([1-9][0-9]*\)\.[^.]*$/{;s//\1/;x;};$!b;x;p' thefile.pgn

与模式匹配的行将减少到最后一个数字并存储。在最后一行,检索存储的字符串并打印它。

您的
sed
脚本可以很容易地扩展到
tail
grep
部分。(使用
sed-n
和控制打印的正则表达式,甚至不再需要删除空行。)

这是假设最后一行从不为空。适应这种额外的要求也不难。下面是一个稍微复杂的版本,它可以做到这一点:

sed -n '/^.* \([1-9][0-9]*\)\.[^.]*$/{;s//\1/;x;};$!b;x;p' thefile.pgn

与模式匹配的行将减少到最后一个数字并存储。在最后一行,检索存储的字符串并打印它。

您的
sed
脚本可以很容易地扩展到
tail
grep
部分。(使用
sed-n
和控制打印的正则表达式,甚至不再需要删除空行。)

这是假设最后一行从不为空。适应这种额外的要求也不难。下面是一个稍微复杂的版本,它可以做到这一点:

sed -n '/^.* \([1-9][0-9]*\)\.[^.]*$/{;s//\1/;x;};$!b;x;p' thefile.pgn

与模式匹配的行将减少到最后一个数字并存储。在最后一行,检索存储的字符串并打印它。

您的
sed
脚本可以很容易地扩展到
tail
grep
部分。(使用
sed-n
和控制打印的正则表达式,甚至不再需要删除空行。)

这是假设最后一行从不为空。适应这种额外的要求也不难。下面是一个稍微复杂的版本,它可以做到这一点:

sed -n '/^.* \([1-9][0-9]*\)\.[^.]*$/{;s//\1/;x;};$!b;x;p' thefile.pgn

与模式匹配的行将减少到最后一个数字并存储。在最后一行,检索存储的字符串并打印它。

此awk也可以工作:

awk -F '\.' 'END{split($(NF-1), a, " "); print a[length(a)]}' file
31

此awk也可以工作:

awk -F '\.' 'END{split($(NF-1), a, " "); print a[length(a)]}' file
31

此awk也可以工作:

awk -F '\.' 'END{split($(NF-1), a, " "); print a[length(a)]}' file
31

此awk也可以工作:

awk -F '\.' 'END{split($(NF-1), a, " "); print a[length(a)]}' file
31

谢谢大家!答案之间很难选择。这是我的版本:

sed -e 's/\*//' -e '/^ *$/d' thefile.p | tail -1 | awk '{print $(NF-1)}' FS='[ .]+'

我接受fedorqui的回答,因为它更优雅。

谢谢大家!答案之间很难选择。这是我的版本:

sed -e 's/\*//' -e '/^ *$/d' thefile.p | tail -1 | awk '{print $(NF-1)}' FS='[ .]+'

我接受fedorqui的回答,因为它更优雅。

谢谢大家!答案之间很难选择。这是我的版本:

sed -e 's/\*//' -e '/^ *$/d' thefile.p | tail -1 | awk '{print $(NF-1)}' FS='[ .]+'

我接受fedorqui的回答,因为它更优雅。

谢谢大家!答案之间很难选择。这是我的版本:

sed -e 's/\*//' -e '/^ *$/d' thefile.p | tail -1 | awk '{print $(NF-1)}' FS='[ .]+'

我接受fedorqui的回答,因为它更优雅。

你期望的输出是什么?你期望的输出是什么?你期望的输出是什么?输出是什么