Batch file 在一行中精确计算一个字符-cmd
我想写一个批处理文件来计算文本文件每行中特定字符的出现次数 例如,字符串Batch file 在一行中精确计算一个字符-cmd,batch-file,cmd,Batch File,Cmd,我想写一个批处理文件来计算文本文件每行中特定字符的出现次数 例如,字符串“aa\bb\cc\dd\”中的\计数将为4 find和findstr仅显示包含确切字符的行数。这里有一种方法: @echo off :checkCountOf string countOf [rtnrVar] :: checks count of a substring in a string setlocal EnableDelayedExpansion set "string=aa" set "string=%
“aa\bb\cc\dd\”
中的\
计数将为4
find
和findstr
仅显示包含确切字符的行数。这里有一种方法:
@echo off
:checkCountOf string countOf [rtnrVar]
:: checks count of a substring in a string
setlocal EnableDelayedExpansion
set "string=aa"
set "string=%~1"
set "checkCountOf=%~2"
if "%~1" equ "" (
if "%~3" neq "" (
endlocal & (
echo 0
set "%~3=0"
exit /b 0
)
) else (
endlocal & (
echo 0
exit /b 0
)
)
)
if "!checkCountOf!" equ "$" (
set "string=#%string%#"
set "string=!string:%checkCountOf%%checkCountOf%=#%checkCountOf%#%checkCountOf%#!"
) else (
set "string=$%string%$"
set "string=!string:%checkCountOf%%checkCountOf%=$%checkCountOf%$%checkCountOf%$!"
)
set LF=^
rem ** Two empty lines are required
set /a counter=0
for %%L in ("!LF!") DO (
for /f "delims=" %%R in ("!checkCountOf!") do (
set "var=!string:%%~R%%~R=%%~L!"
set "var=!var:%%~R=%%~L!"
for /f "tokens=* delims=" %%# in ("!var!") do (
set /a counter=counter+1
)
)
)
if !counter! gtr 0 (
set /a counter=counter-1
)
if "%~3" neq "" (
endlocal & (
echo %counter%
set "%~3=%counter%"
)
) else (
endlocal & (
echo %counter%
)
)
你可以这样称呼它:
call ::checkCountOf "/aa/b/c/" "/" slashes
echo %slashes%
exit /b %errorlevel%
无法使用某些特殊字符(“
,~
和!
)
您还可以使用替换和回声关闭
SETLOCAL
设置“String=a\b\c\\\\d”
调用:计数“%string%”\
回显百分比计数%
后藤:EOF
:计数
SETLOCAL enabledelayedexpansion
集合/a计数=0
设置“$2=%~1”
:cloop
设置“$1=%$2%”
设置“$2=$1:*%2=!"
如果“%$1%”neq“%$2%”集合/a计数+=1,则转到cloop
endlocal和SET tally=%tally%
后藤:eof
这里有一种计算字符串中特定字符的方法。它不适用于常见的可疑字符。未进行广泛测试,但适用于您的示例
@ECHO OFF
SETLOCAL disabledelayedexpansion
SET "String=\a\b\c\\\\d\\"
set "previous=%string%"
set /a count=0
:loop
set "newstg=%previous:*\=%"
IF NOT "%previous%"=="%newstg%" (
set /a count+=1
set "previous=%newstg%"
IF DEFINED previous goto loop
)
echo %count%
pause
GOTO :eof
这里还有一个选择。我不认为这是防弹的毒药字符
@ECHO OFF
SETLOCAL disabledelayedexpansion
SET "String=\\a\b\c\\\\d\\"
set i=0
set "x=%string%"
set "x=%x:\=" & set /A i+=1 & set "x=%"
echo %i%
pause
您可以尝试以下脚本,将输入字符串作为(带引号的)命令行参数提供:
set“STRING=%~1$”
set STRING=“%STRING:\=”“%”
设置/A“计数=-1”
对于%%E in(%STRING%)设置/A“计数+=1”
“\`”的回显计数:%Count%
这将替换要由“
+空格+”
计数的每个字符,并将整个字符串包含在”
之间,因此输入字符串aa\bb\cc\dd\
变为“aa”“bb”“cc”“dd”“
。生成的字符串被送入for
循环,该循环识别要迭代的单个项——在本例中为5。计数器变量COUNT
使用值-1
初始化,因此结果不是迭代项目的数量,而是分隔符,即原始字符串中存在的\
字符
如果字符串包含?
或*
字符,此方法将失败。如果要计数的字符是下列字符之一,“
,%
,=
,*
,~
,则计数也会失败
@echo off
setlocal
set "string=aa\bb\cc\dd\"
set "count=-1"
for %%a in ("%string:\=" "%") do set /A count+=1
echo %count%
只要字符串不包含通配符,此方法就可以正常工作:*?
;如果需要,我将使用相同的Npcmaka方法,但编写方式更简单:
@echo off
setlocal EnableDelayedExpansion
set "string=aa\bb\cc\dd\"
set "str=A%string%Z"
set "count=-1"
for /F "delims=" %%a in (^"!str:\^=^"^
% Do NOT remove this line %
^"!^") do (
set /A count+=1
)
echo %count%
虽然速度慢,但你可以试试这个
@echo关闭
setlocal enableextensions disabledelayedexpansion
设置“inputFile=input.txt”
设置“searchChar=\”
对于/f“delims=”%%a in('
findstr/n“^”“%inputFile%”
“)为/f”delims=:“%%b in(“%%~a”)做什么(
设置“行=%%a”
对于/f%%c英寸('
cmd/u/v/e/q/c“(echo(!line::=!)”^ find/c“%searchChar%”
“)回显行%%b有%%c个字符
)
使用
findstr/n
读取输入文件,以获取文件中带有数字前缀的所有行(用于输出“装饰”,并确保文件中的所有行都已处理)。每行都在管道内处理,从cmd
到find
。cmd
实例以unicode输出开始(/u
)因此,当读取的行被回送时,输出将是每个输入字符的两个字节序列,其中一个是0x0
ASCII字符。find
命令将0
视为行终止符,因此我们将输入行中的每个字符作为一个单独的行。现在,find
命令计算lin的数量es搜索到的字符发生了。很遗憾,可能的重复将不会返回“\`”序列的正确结果。哈!非常简单是的。我现在从另一个问题中记住了这个逻辑。不记得是在DosTips上还是在这里。嗨,Antonio。刚刚意识到,如果存在连续字符,您的第二组代码将无法工作。aa\bb\\cc\dd \-这只算4。你应该发布你的第二个解决方案…@Aacini,谢谢。只是忘记了链接。前几天在这个问题上。