批量只保留字符串中的某些字符

时间:2013-05-03 14:29:39

标签: string for-loop batch-file trim

我有一个变量来自批处理文件中的for循环:

for /f Tokens^=3^,10delims^=^<^>^" %%i in ('findstr -i "href=" bookmarks.html') do (
   set str1=%%j

如何只保留变量str1中的某些字符? :a-z,A-Z,0-9

示例: Blabla</2378:., =&gt; Blabla2378

提前致谢。

1 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "string=+"
FOR /l %%i IN (32,1,127) DO CALL :addstring %%i
ECHO !string!
FOR /l %%i IN (100,-1,0) DO CALL :delstring %%i
ECHO !string!
GOTO :eof

:addstring
CALL CMD /c EXIT /b %1
SET "string=!string!!=exitcodeascii!"
GOTO :eof

:delstring
SET cp=!string:~%1!
IF NOT DEFINED cp GOTO :EOF 
ECHO abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ|FIND "!string:~%1,1!" >NUL 2>nul
IF NOT ERRORLEVEL 1 GOTO :eof
SET /a cp=%1+1
SET "string=!string:~0,%1!!string:~%cp%!"
GOTO :eof

嗯 - 这是至少做很多事情的方法。

ADDSTRING例程只是构建一个字符列表,开头有一个“+”,除了演示字符串以空格开头之外没有任何理由。

重复调用delstring,从字符串末尾向后运行,删除不在alphamerics列表中的每个字符。

<小时/> 编辑以应用示例字符串

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "string=+-=++()*&^^^#!!!<--remove all of those and those----->.,?/';][}{__"
ECHO before: !string!
FOR /l %%i IN (70,-1,0) DO CALL :delstring %%i
ECHO after : !string!
SET "string= "blablabla23:/./é'""
ECHO before: !string!
FOR /l %%i IN (20,-1,0) DO CALL :delstring %%i
ECHO after : !string!
GOTO :eof

:delstring
SET cp=!string:~%1!
IF NOT DEFINED cp GOTO :EOF 
ECHO abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ|FIND "!string:~%1,1!" >NUL 2>nul
IF NOT ERRORLEVEL 1 GOTO :eof
SET /a cp=%1+1
SET "string=!string:~0,%1!!string:~%cp%!"
GOTO :eof

对OP的警告:语法SET string = "something" IS 对空格的存在敏感。它设置变量"string "的值 - 而不是"string" - 变量名称中的空格包含在内。同样,前导空格和双引号ARE包含在分配的值中。

语法set "var=value"旨在确保行上的任何尾随空格不包含在赋给变量var的值中。请注意,此语法允许在指定的字符串中使用双引号。


进一步的方法

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET str1="blabla"
SET "allowedchars=abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"

ECHO before: !str1!
FOR /l %%i IN (70,-1,0) DO CALL :delstr1 %%i
ECHO after : !str1!
SET "str1= "blablabla23:/./é'""
ECHO before: !str1!
FOR /l %%i IN (20,-1,0) DO CALL :delstr1 %%i
ECHO after : !str1!

ECHO ============================ now let's try that again.
ENDLOCAL
SETLOCAL ENABLEDELAYEDEXPANSION
SET str1="blabla"
SET "allowedchars=abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"

ECHO before: !str1!
CALL :delstr2 str1
ECHO after : !str1!
SET "str1= "blablabla23:/./é'""
ECHO before: !str1!
CALL :delstr2 str1
ECHO after : !str1!



GOTO :eof

:delstr1
SET cp=!str1:~%1!
IF NOT DEFINED cp GOTO :EOF 
ECHO !allowedchars!|FIND "!str1:~%1,1!" >NUL 2>nul
IF NOT ERRORLEVEL 1 GOTO :eof
SET /a cp=%1+1
SET "str1=!str1:~0,%1!!str1:~%cp%!"
GOTO :eof

:delstr2
SETLOCAL
SET cp=0
:delstr2a
SET "$_=!%1:~%cp%!"
IF DEFINED $_ SET /a cp+=1&GOTO delstr2a
SET "$_=!%1!"
:delstr2b
IF NOT DEFINED %1 GOTO delstr2done
SET /a cp-=1
IF %cp% lss 0 GOTO delstr2done
ECHO !allowedchars!|FIND "!$_:~%cp%,1!" >NUL 2>NUL
IF NOT ERRORLEVEL 1 GOTO delstr2b
SET /a ca=cp+1
SET "$_=!$_:~0,%cp%!!$_:~%ca%!"
GOTO delstr2b
:delstr2done 
endlocal&SET "%1=%$_%"
GOTO :EOF

批处理速度非常慢。它可以完成这项工作,它只是花时间来解决它。我的意思是我也可以在后院割草 - 我只是花时间去研究它。

现在,如果你想在成千上万的字符串上完成这项工作,大概是他们在一个或多个文件中。你应该找到SED - 谷歌搜索GNU SED将是一个良好的开端。

执行您所要求的SED行

sed s/[^^a-zA-Z0-9]//g <filename >newfilename

需要双重插入符号,因为就CMD.EXE而言,插入符号是一个特殊字符,因此它需要被插入符号转义。