Batch file 需要帮助创建批处理文件来计算每行的行数和返回值吗

Batch file 需要帮助创建批处理文件来计算每行的行数和返回值吗,batch-file,Batch File,需要浏览WEBVTT(包含字幕的简单垂直位置信息的文本文件),计算行数并返回时间戳旁边的值 我是新手,尝试了regex查找和替换,但没有成功 我在一个带有字幕的文件中包含以下内容: WEBVTT 00:00:00.000 --> 00:00:02.160 Hello World I am James 00:00:02.185 --> 00:00:04.990 Welcome to my Show! 00:00:12.038 --> 00:00:14.530 This is

需要浏览WEBVTT(包含字幕的简单垂直位置信息的文本文件),计算行数并返回时间戳旁边的值

我是新手,尝试了regex查找和替换,但没有成功

我在一个带有字幕的文件中包含以下内容:

WEBVTT

00:00:00.000 --> 00:00:02.160
Hello World
I am James

00:00:02.185 --> 00:00:04.990
Welcome to my Show!

00:00:12.038 --> 00:00:14.530
This is our new season.
We hope you enjoy the show

00:00:19.580 --> 00:00:21.840
This is the first episode.
并希望脚本使用时间戳检查每个部分,并返回以下内容:

WEBVTT

00:00:00.000 --> 00:00:02.160 align:middle line:84%
Hello World
I am James

00:00:02.185 --> 00:00:04.990 align:middle line:90%
Welcome to my Show!

00:00:12.038 --> 00:00:14.530 align:middle line:84%
This is our new season.
We hope you enjoy the show!

00:00:19.580 --> 00:00:21.840 align:middle line:90%
This is the first episode.
如果只有一行,则时间戳旁边的返回值将为

align:middle line:90%
Else
align:middle line:84%
Windows命令处理器
cmd.exe
执行批处理文件是为运行命令和应用程序而设计的。它不是为在文本文件中进行修改而设计的。还有许多其他脚本语言,它们具有可以轻松修改文本文件的功能,如VBScript、JScript、PowerShell、Python、Perl等等。。。因此,使用Windows命令处理器执行此任务是某人可能做出的最糟糕的决定

然而,使用Dave Benham编写的批处理文件/JScript混合体,在使用JScript的文件上运行正则表达式替换,这仍然是一项容易实现的任务

@echo off
if not exist "%~dp0jrepl.bat" goto :EOF
if not exist "WEBVTT" goto :EOF

call "%~dp0jrepl.bat" "(\d{2}:\d{2}:\d{2}\.\d{3} --\> \d{2}:\d{2}:\d{2}\.\d{3})(\r?\n[^\r\n]+\r?\n[^\r\n])" "$1 align:middle line:84%%$2" /M /F "WEBVTT" /O -
call "%~dp0jrepl.bat" "(\d{2}:\d{2}:\d{2}\.\d{3} --\> \d{2}:\d{2}:\d{2}\.\d{3})(\r?\n[^\r\n])" "$1 align:middle line:90%%$2" /M /F "WEBVTT" /O -
批处理文件首先检查当前目录中是否有名为
WEBVTT
的文件,如果此条件不正确,则立即退出,请参阅

批处理文件JREPL.BAT必须存储在与具有上述代码的批处理文件相同的目录中。因此,批处理文件接下来检查批处理文件的目录中是否确实存在JREPL.BAT,如果此条件不正确,则退出

然后使用JREPL.BAT两次运行文件
WEBVTT
上的两个正则表达式替换,以将其内容更改为所需格式

让我们看一下第一个搜索表达式:

(\d{2}:\d{2}:\d{2}\.\d{3} --\> \d{2}:\d{2}:\d{2}\.\d{3})(\r?\n[^\r\n]+\r?\n[^\r\n])
。。。定义标记组。此第一个标记组中的表达式找到的字符串在替换字符串中用
$1
反向引用,以保持未修改找到的和匹配的字符串的这一部分。标记组中的正则表达式用于在行中的任意位置查找具有字符串的行,如
00:00:02.185-->00:00:04.990

\d{2}
。。。意味着必须找到正匹配的正好两个数字

\。
。。。点表示任何字符,因此必须用反斜杠转义才能解释为文字字符

\d{3}
。。。意味着必须找到正匹配的正好三位数字

\>
。。。另外,
需要用反斜杠转义,以解释为文字字符

。。。定义第二个标记组。此第二个标记组中的表达式找到的字符串在替换字符串中用
$2
反向引用,以保持找到的字符串的这部分也未修改

\r?\n
。。。必须有一个换行符,该换行符可以选择在前后换行,例如
00:00:02.185-->00:00:04.990

[^\r\n]+
。。。下一行必须有一个或多个字符不是回车符或换行符。因此,搜索表达式在下一行为空行时为负数。请注意,仅包含空格/制表符的行不是空行。这是一个空行,因为它只包含空格字符,但不是空行

\r?\n[^\r\n]
。。。最后,还必须有一行DOS/Windows或UNIX结尾,下一行还必须包含一个字符,表示正匹配

因此,第一个搜索表达式将带字幕的行与两行匹配

因此,第一个替换字符串包含
84%
,其中必须用一个以上的百分号转义百分号,因为否则Windows命令处理器会将
%
解释为环境变量或批处理文件参数引用的开头

第二个搜索表达式类似于第一个,但仅在时间值为而非的行上为正,在第二个时间值之后已经有更多文本,并且下面还有一行不是空行

这两个正则表达式都是多行表达式,需要JREPL选项
/M

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • 呼叫/?
    。。。还解释了
    %~dp0
    。。。参数0的驱动器和路径是批处理文件本身
  • echo/?
  • goto/?
  • 如果/?
  • jrepl.bat/?

  • 执行批处理文件的Windows命令处理器是为运行命令和应用程序而设计的。它不是为在文本文件中进行修改而设计的。还有许多其他脚本语言,它们具有可以轻松修改文本文件的功能,如VBScript、JScript、PowerShell、Python、Perl等等。。。因此,使用Windows命令处理器执行此任务是某人可能做出的最糟糕的决定

    然而,使用Dave Benham编写的批处理文件/JScript混合体,在使用JScript的文件上运行正则表达式替换,这仍然是一项容易实现的任务

    @echo off
    if not exist "%~dp0jrepl.bat" goto :EOF
    if not exist "WEBVTT" goto :EOF
    
    call "%~dp0jrepl.bat" "(\d{2}:\d{2}:\d{2}\.\d{3} --\> \d{2}:\d{2}:\d{2}\.\d{3})(\r?\n[^\r\n]+\r?\n[^\r\n])" "$1 align:middle line:84%%$2" /M /F "WEBVTT" /O -
    call "%~dp0jrepl.bat" "(\d{2}:\d{2}:\d{2}\.\d{3} --\> \d{2}:\d{2}:\d{2}\.\d{3})(\r?\n[^\r\n])" "$1 align:middle line:90%%$2" /M /F "WEBVTT" /O -
    
    批处理文件首先检查当前目录中是否有名为
    WEBVTT
    的文件,如果此条件不正确,则立即退出,请参阅

    批处理文件JREPL.BAT必须存储在与具有上述代码的批处理文件相同的目录中。因此,批处理文件接下来检查批处理文件的目录中是否确实存在JREPL.BAT,并退出