@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