Regex 提取目录中所有文件中特定行中第一个和第二个逗号之间的字符串

Regex 提取目录中所有文件中特定行中第一个和第二个逗号之间的字符串,regex,string,batch-file,command,findstr,Regex,String,Batch File,Command,Findstr,我试图提取一个字符串,该字符串位于一系列文本文件(字幕文件)中特定行的第一个和第二个逗号之间。文本文件的格式如下: 字幕01.txt [V4+ Styles] Format: Name, Fontname, Fontsize, PrimaryColour Style: Default, Estrangelo Edessa, 57, &H00FFFFFF Style: Title1, Arno Pro, 65, &H00606066 字幕02.txt [V4+ Styles] F

我试图提取一个字符串,该字符串位于一系列文本文件(字幕文件)中特定行的第一个和第二个逗号之间。文本文件的格式如下:

字幕01.txt

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour
Style: Default, Estrangelo Edessa, 57, &H00FFFFFF
Style: Title1, Arno Pro, 65, &H00606066
字幕02.txt

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour
Style: OP Eng, Arno Pro, 45, &H00100F11
Style: ED Romaji, Nueva Std Cond, 46, &H00FFFFFF
字幕03.txt

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour
Style: OP Eng, Estrangelo Edessa, 45, &H00100F11
Style: Default, Arno Pro, 45, &H00100F11
Style: ED Romaji, Nueva Std Cond, 46, &H00FFFFFF
我想在这里实现的是提取以“Style:”开头的每一行的字体名,然后以不重复的方式确定哪些字幕包含我想要的字体。因此,基本上,最终结果将输出到一个文本文件,如下所示:

Subtitles01.txt: Estrangelo Edessa
Subtitles01.txt: Arno Pro
Subtitles02.txt: Arno Pro
Subtitles02.txt: Nueva Std Cond
Subtitles03.txt: Estrangelo Edessa
Subtitles03.txt: Arno Pro
Subtitles03.txt: Nueva Std Cond

Only Subtitles03.txt is needed.
由于Subtitles03.txt包含Subtitles01.txt和Subtitles02.txt中的所有字体,因此只需要Subtitles03.txt。目标是使用最少的文件量在所有文件中找到唯一的字体。我已经使用findstr提取了以下批处理脚本,以“Style:”开头的行,但是我被困在了后面

@echo off
findstr /B /C:"Style:" *.txt > results.txt
if %errorlevel%==0 (
    echo Found! logged files into results.txt
) else (
    echo No matches found
)
任何帮助都将不胜感激。谢谢你们

Style: (.*),(.*),(.*),(.*)
然后,得到第二个匹配结果。只需确保使用整个字符串即可。不仅仅是从括号开始

编辑

对不起,我没有注意到实际上有四个街区,有三个逗号,而不是三个街区,有两个逗号。代码现在正在运行并已修复

然后,得到第二个匹配结果。只需确保使用整个字符串即可。不仅仅是从括号开始

编辑


对不起,我没有注意到实际上有四个街区,有三个逗号,而不是三个街区,有两个逗号。代码现在正在工作并已修复。

编辑:使用此代码:

^Style:\s*([^,]+)\s*,\s*([^,]+)\s*,\s*([^,]+)\s*,\s*(.+)\s*

编辑:使用此选项:

^Style:\s*([^,]+)\s*,\s*([^,]+)\s*,\s*([^,]+)\s*,\s*(.+)\s*

<>我意识到你显然是在一个平台上,它没有默认的<代码> AWK 或Perl,但是你可能仍然想考虑安装这些工具中的一个,特别是如果你将来需要执行类似任务的时候。
awk -F, '/^Style:/ { print FILENAME ":" $2 }' *.txt
或者使用Perl:

perl -ne 'print "$ARGV:$1\n" if m/^Style: [^,]*,([^,]*)/' *.txt

用这两种语言进行后续优化(删除与其他匹配文件重叠的任何文件)并不困难。Perl更适合更大、更多样化的任务,所以如果你不熟悉这两个任务,这将是我的第一个建议(代价是一个更长的、稍微有点颠簸的学习曲线,然后你也应该考虑Python)。但是,您可能仍然想考虑安装这些工具中的一种,特别是如果将来需要执行类似任务时。
awk -F, '/^Style:/ { print FILENAME ":" $2 }' *.txt
或者使用Perl:

perl -ne 'print "$ARGV:$1\n" if m/^Style: [^,]*,([^,]*)/' *.txt

用这两种语言进行后续优化(删除与其他匹配文件重叠的任何文件)并不困难。Perl更适合于更大、更多样化的任务,所以如果你不熟悉这两个任务,这将是我的第一个建议(代价是一个更长的、稍微有点颠簸的学习曲线,然后你也应该考虑Python)。或者至少使用非本机实用程序。但这里有一个纯本地批处理解决方案

我看不出FINDSTR正则表达式对解决这个问题有什么帮助。它不能像许多其他非本机批处理正则表达式实用程序那样提取匹配行的一部分

您可以使用FOR/F从每个文件中提取字体:

for /f "tokens=2 delims=," %%A in ('findstr /lb "Style:" file.txt') do echo font=%%A
您可以使用环境变量列出唯一字体的列表。使用变量名称中的字体名称定义变量,所有变量的前缀均为
font\uu
。只能为给定名称定义一个变量。指定的值并不重要。然后,您可以使用
设置字体
列出所有唯一的字体名称。可以计算唯一名称的数量,也可以解析出实际的字体名称(删除
font\uu
前缀)

棘手的部分是建立覆盖完整的唯一字体名称集所需的最小文件集。我想有人能想出一个有效的解决办法。我刚刚使用了一种蛮力递归排列方法:我计算每个排列中找到的唯一字体的数量,并将数量与唯一字体的总数进行比较。我已经添加了一些快捷方式,如果我已经找到了一个比当前集合更小的完整集合,那么就不会沿着特定的排列路径进行

如果在递归中使用SETLOCAL,代码可能会更简单,但批处理仅限于32个SETLOCAL级别。我想要一个能够支持32个以上文件的解决方案,尽管我有点担心这么多文件的性能

编辑-我修复了
:permuteFiles
例程中的一个错误,该错误在我有3个以上的文件时出现

以下是使用示例输入的结果:

Available fonts
----------------------------
Subtitles01.txt: Estrangelo Edessa
Subtitles01.txt: Arno Pro
Subtitles02.txt: Arno Pro
Subtitles02.txt: Nueva Std Cond
subtitles03.txt: Estrangelo Edessa
subtitles03.txt: Arno Pro
subtitles03.txt: Nueva Std Cond

Unique fonts
----------------------------
 Arno Pro
 Estrangelo Edessa
 Nueva Std Cond

The following files contain the complete set of unique fonts:
-------------------------------------------------------------
subtitles03.txt

我想除了批处理之外,使用其他语言会容易得多,或者至少使用非本机实用程序。但这里有一个纯本地批处理解决方案

我看不出FINDSTR正则表达式对解决这个问题有什么帮助。它不能像许多其他非本机批处理正则表达式实用程序那样提取匹配行的一部分

您可以使用FOR/F从每个文件中提取字体:

for /f "tokens=2 delims=," %%A in ('findstr /lb "Style:" file.txt') do echo font=%%A
您可以使用环境变量列出唯一字体的列表。使用变量名称中的字体名称定义变量,所有变量的前缀均为
font\uu
。只能为给定名称定义一个变量。指定的值并不重要。然后,您可以使用
设置字体
列出所有唯一的字体名称。可以计算唯一名称的数量,也可以解析出实际的字体名称(删除
font\uu
前缀)

棘手的部分是建立覆盖完整的唯一字体名称集所需的最小文件集。我想有人能想出一个有效的解决办法。我刚刚采用了一种蛮力递归排列方法:我计算了