我有一个来自for
批处理文件中的循环的变量:
for /f Tokens^=3^,10delims^=^<^>^" %%i in ('findstr -i "href=" bookmarks.html') do (
set str1=%%j
如何在变量中只保留某些字符str1
?:阿兹,阿兹,0-9
示例:
Blabla</2378:.,
=> Blabla2378
提前致谢。
我有一个来自for
批处理文件中的循环的变量:
for /f Tokens^=3^,10delims^=^<^>^" %%i in ('findstr -i "href=" bookmarks.html') do (
set str1=%%j
如何在变量中只保留某些字符str1
?:阿兹,阿兹,0-9
示例:
Blabla</2378:.,
=> Blabla2378
提前致谢。
@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
,从字符串末尾向后运行,将删除不在字母列表中的每个字符。
@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"
空格的存在很敏感。它设置变量的值"string "
- 而不是"string"
- 空间包含在变量名称中。同样,前导空格和双引号也包含在分配的值中。
该语法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
,因此它需要被插入符号转义。