批处理文件可以报告找到的字符串的列号吗?

Can a Batch file report column number of found string?

我有固定长度的大文本文件,列之间用两个空格分隔。 我真正想做的是让一个批处理文件根据文本文件中的第一行和最后一行报告每列数据的开始和结束列号。

文本文件中的第一行和最后一行应该相同(相同的列字节),如果不同则报告。 有时最后一行有一个额外的回车 return,所以我确信必须检查并删除它,然后分析最后一行以与第一行进行比较。

这些行可能包含以下 [aA,zZ]、[0-9]、=、^、?、\、/、%、;

0000000000  00000  000000000=000000000  KM000000

以上可以报告(2 个空格作为分隔符) 10, 2, 5, 2, 19, 2, 8

或者报告每列的范围(2个空格作为分隔符) 1-10,11-12,13-17,18-36,37-38,39-46

我不确定这是否可能或什至从哪里开始。 我知道展示代码示例是需要和首选的,但我只是不确定如何从一开始就去做。

如有任何帮助,我们将不胜感激。

我认为我的 JREPL.BAT regular expression text processor 可以帮上大忙。它是一个混合 JScript/batch 脚本,运行 可以在从 XP 开始的任何 Windows 机器上本地运行。

通过 运行ning jrepl /? 从命令行获得大量文档。您可能希望使用 jrepl /? | more 一次获取一个屏幕的帮助。但是我的控制台配置了一个大的输出缓冲区,所以我可以向上滚动查看之前的输出,所以我不需要更多。

我相信以下内容几乎可以满足您的需求。它分析指定文本文件的第一行和最后一行,并打印出每行内以逗号分隔的列偏移列表。如果它在每列之间检测到无效字符或除两个 space 之外的其他字符,则它会在输出中包含 ERROR。我修改了输出以排除两个 space 分隔符的位置。

以下命令应该是来自命令行的 运行,假设您在 PATH 中包含的文件夹中有 JREPL.BAT。

jrepl "([a-zA-Z0-9=^?\/%;]+)(?:  )?|.+" "','+($off+1)+'-'+($off+.length)|' ERROR'" /c /j /t "|" /jbegln "skip=(ln!=1&&ln!=cnt)" /jendln "$txt=skip?false:$txt.slice(1)" /f test.txt

这是您的示例文本文件的输出:

1-10,13-17,20-38,41-48
1-10,13-17,20-38,41-48

如果将命令放在批处理脚本中,则应使用 CALL JREPL,在这种情况下需要对百分比进行双重转义。

call jrepl "([a-zA-Z0-9=^?\/%%%%;]+)(?:  )?|.+" "','+($off+1)+'-'+($off+.length)|' ERROR'" /c /j /t "|" /jbegln "skip=(ln!=1&&ln!=cnt)" /jendln "$txt=skip?false:$txt.slice(1)" /f test.txt

工作原理

/f "test.txt" 指定源文件,在本例中为 "test.txt"

/c 计算文件中的行数并将值存储在变量 cnt.

中 如果当前行是 1 或 cnt,

/jbegln ... 通过将 skip 设置为真来禁用搜索和替换。

如果 skip 为真,

/jendln ... 禁用当前行的打印,否则从输出中去除初始逗号。

/j 将替换字符串视为 JScript 代码。

/t "|" 将搜索和替换字符串视为类似大小的表达式列表,由 | 分隔。第一个替换表达式与第一个搜索表达式一起使用,第二个替换表达式与第二个搜索表达式一起使用。搜索是从左到右处理的,因此仅当第一个表达式匹配失败时才测试第二个表达式。

第一个参数是搜索表达式列表。

第二个参数是替换表达式列表。

搜索 1:查找具有一个或多个有效字符的有效列,可以选择紧跟两个 space。请注意,第一个搜索表达式被分配了 $1,因此括号中捕获的表达式(实际数据列)变为 $2 而不是 $1。

替换 1:逗号,后跟匹配的偏移量(基于 0)+ 1,后跟破折号,后跟匹配偏移量 + 捕获的表达式的长度。

搜索 2:查找任意字符的字符串。

替换 2:“ERROR”字符串。