@echo off
setlocal
set "skip="
for /f "delims=:" %%N in (
'findstr /nlc:"BALANCE REPORT" example.report'
) do if not defined skip set skip=%%N
if not defined skip (
echo BALANCE REPORT not found
exit /b 1
)
set /a skip-=1
if %skip% equ 0 (
set "skip="
) else (
set "skip=+%skip%"
)
more %skip% example.report >NightlyAudit.txt
注多一点,更多的会将任何[Tab]字符转换为一系列空格。还有一个潜在的问题。我不确定MORE可以跳过多于64K行,如果您的源文件有1000页,每行有60行,那么您可能会接近极限。
因此,MORE可能无法为您工作,在这种情况下您需要一种替代方案。这是一种使用纯批处理的方法,但速度相对较慢,每行约8190字节。
替换为较命令下面的比赛后打印所有行:
...
>NightlyAudit.txt (
for /f "skip=%skip% delims=" %%A in ('findstr /n "^" example.report') do (
set "ln=%%A"
setlocal enableDelayedExpansion
echo(!ln:*:=!
endlocal
)
)
如果要包括匹配行,则跳过变量的计算改变了一下,一样的FOR/F选项。 FOR/F也不允许skip = 0,但语法与MORE相比稍有不同。
...
set /a skip-=1
if %skip% equ 0 (
set "skip="
) else (
set "skip=skip=%skip%"
)
>NightlyAudit.txt (
for /f "%skip% delims=" %%A in ('findstr /n "^" example.report') do (
...
这是很容易,如果你使用其他脚本语言与你输入的单一读出,以实现自己的目标。例如,你可以在CSCRIPT中使用JScript。
例如,可以使用下列写匹配后的所有行:
writeAfterMatch。JS
var str, go=0;
while (!WScript.StdIn.AtEndOfStream) {
str=WScript.StdIn.ReadLine();
if (go) WScript.StdOut.WriteLine(str);
if (!go) if (str.indexOf(WScript.Arguments(0))>0) go=1;
}
使用
cscript //nologo writeAfterMatch.js "BALANCE REPORT" <example.report >NightlyAudit.txt
只是扭转几行的顺序,并可以包括匹配行:
writeAfterMatchInclusive.js
var str, go=0;
while (!WScript.StdIn.AtEndOfStream) {
str=WScript.StdIn.ReadLine();
if (!go) if (str.indexOf(WScript.Arguments(0))>0) go=1;
if (go) WScript.StdOut.WriteLine(str);
}
使用
cscript //nologo writeAfterMatchInclusive.js "BALANCE REPORT" <example.report >NightlyAudit.txt
另一种选择是用我的JREPL.BAT text processing utility解决用最少的代码的问题。 JREPL是纯粹的脚本(混合JScript /批处理),它可以在任何从XP以后的Windows机器上本机运行。通过从命令行发布JREPL /??
可以获得完整的文档。
它可能看起来很吓人,因为有太多的选择。但解决方案其实很简单。
您需要向我们提供您熟悉的代码,然后寻求帮助。 – Compo
编辑为OP – brodimaggio12
您需要对示例报告中您要搜索的内容非常具体。您现在提供的示例是在内容中搜索区分大小写的BALANCE项和区分大小写的REPORT项。 – Compo