
我目前正在嘗試編寫一個批次腳本,此時,我需要找到一個字串“null”,並確定它在文件中顯示的次數。
每次腳本啟動時,我都會從網站下載 API,並且在其 API 中不時出現「null」。當他們的API被下載時,它被下載到一行,我一直在嘗試這樣做:
findstr /C:"null" %TEMP%\$SELECT%.txt | find /C "null" > $TEMP$\$SELECT$-status.txt
但由於文件只有 1 行長,因此僅顯示「1」。
還有其他方法可以輸出「null」在檔案中的次數嗎?
新增者: 巴洛普
OP 也剛剛提到他無法安裝第 3 方軟體。
答案1
我必須相信這個問題以前已經被問過並回答過。但這裡有一個簡單的批次腳本可以完成這項工作。
::StringCount String File
::
:: Count the number of times that String appears in File.
:: The search is not case sensitive.
:: Enclosing quotes are not considered to be part of the string.
:: The string cannot contain =
::
@echo off
setlocal disableDelayedExpansion
set count=0
for /f usebackq^ delims^=^ eol^= %%A in (%2) do set "ln=%%A"&call :testLine %1
echo %count%
exit /b
:testLine
setlocal enableDelayedExpansion
:testLine2
if defined ln if "!ln:*%~1=!" neq "!ln!" (
set /a count+=1
set "ln=!ln:*%~1=!"
goto testLine2
)
endlocal & set /a count=%count%
exit /b
命令列用法是
StringCount null yourFile.txt
對於大文件,這可能會變得相當慢。
我寫了一個稱為 REPL.BAT 的混合 JScript/批次實用程式這可以使工作變得容易並且應該相當快。此實用程式對從 stdin 讀取的行執行正規表示式搜尋和替換,並將結果寫入 stdout。它有相當多的選項,包括簡化此任務的選項。該實用程式是純腳本,可以在 XP 及以上版本的任何現代 Windows 電腦上執行。完整的文檔嵌入在腳本中。
這是如何使用它來解決您的問題,假設搜尋是區分大小寫。
<yourFile.txt repl (null) \n$1\n ax | find /c "null"
如果您希望搜尋是不區分大小寫
<yourFile.txt repl (null) \n$1\n aix | find /i /c "null"
答案2
您可以選擇下載單一執行檔嗎?
您需要的是一個移植良好的grep
實用程式。
例如 grep (GNU grep) 2.16
您想要的選項是-c
或--count
。
根據下面 @dbenham 的評論,實際上不僅計算帶有「null」的行,而且還計算每行多個實例的方法是:
grep -o null 要讀取的檔案.txt | grep -c
答案3
這不是一個非常純粹的方法。它要求您獲得帶有 coreutils 和 grep 軟體包的 gnuwin32。
如果有人可以用純批次來做到這一點,那麼從某種意義上來說就更好了。
但 grep 和 wc 是您可以在 Windows 中執行的 GNU/linux 方式。
copy con aa <-- 建立 aa 檔。請注意,它有 3 次 rrr 字串。
C:\blah>copy con a.a
sdfsdfsdfsrrrsdfsdfsdfdrrrsdfsdf
dsfsdfsddsd
sdfsdfsdjsdjksdjklsdjlksdrrr^Z
1 file(s) copied.
(grep -o 上的 -o 很重要,因此它不會返回整行。這尤其重要,因為如果 rrr 在一行上出現多次,您不只是希望它只為該行顯示一次 rrr。grep -o 獲取新行中每次出現的rrr ,總行數就是出現的總數)
C:\blah>grep -o rrr a.a
rrr
rrr
rrr
C:\blah>grep -o rrr a.a | wc -l
3
C:\blah>