Regex 如何从txt文件中减去字符串和非空值项?
我有一个脚本,可以提取以下行: 这是一条线:= 这是第2行:= 并将所有相同类型的文件输出到另一个.txt文件中,如下所示: 这是一条线 这是第二行 脚本如下所示:Regex 如何从txt文件中减去字符串和非空值项?,regex,parsing,batch-file,Regex,Parsing,Batch File,我有一个脚本,可以提取以下行: 这是一条线:= 这是第2行:= 并将所有相同类型的文件输出到另一个.txt文件中,如下所示: 这是一条线 这是第二行 脚本如下所示: set "file=%cd%/Config.mak" set /a i=0 set "regexp=.*:=$" setlocal enableDelayedExpansion IF EXIST Source_List.txt del /F Source_List.txt for /f "usebackq delims=" %%a
set "file=%cd%/Config.mak"
set /a i=0
set "regexp=.*:=$"
setlocal enableDelayedExpansion
IF EXIST Source_List.txt del /F Source_List.txt
for /f "usebackq delims=" %%a in ("%file%") do (
set /a i+=1
call set Feature[!i!]=%%a
)
cd .. && cd ..
rem call echo.!Feature[%i%]!
for /L %%N in (1,1,%i%) do (
echo(!Feature[%%N]!|findstr /R /C:"%regexp%" >nul && (
call echo FOUND
call set /a j+=1
call set Feature_Disabled[%j%]=!Feature[%%N]:~0,-2!
call echo.!Feature_Disabled[%j%]!>>Source_List.txt
) || (
call echo NOT FOUND
)
)
endlocal
set "file=%cd%/Config.mak"
set /a i=0
set "regexp=.*:=true$"
setlocal enableDelayedExpansion
IF EXIST Source_List2.txt del /F Source_List2.txt
for /f "usebackq delims=" %%a in ("%file%") do (
set /a i+=1
call set Feature[!i!]=%%a
)
cd .. && cd ..
rem call echo.!Feature[%i%]!
for /L %%N in (1,1,%i%) do (
echo(!Feature[%%N]!|findstr /R /C:"%regexp%" >nul && (
call echo FOUND
call set /a j+=1
call set Feature_Disabled[%j%]=!Feature[%%N]:~0,-6!
call echo.!Feature_Disabled[%j%]!>>Source_List2.txt
) || (
call echo NOT FOUND
)
)
endlocal
我还有另一个提取行的脚本,例如:
这是另一行:=真
这是另一行:=真
并将所有相同类型的文件输出到另一个.txt文件中,如下所示:
这是另一条线
这是另一条线
脚本如下所示:
set "file=%cd%/Config.mak"
set /a i=0
set "regexp=.*:=$"
setlocal enableDelayedExpansion
IF EXIST Source_List.txt del /F Source_List.txt
for /f "usebackq delims=" %%a in ("%file%") do (
set /a i+=1
call set Feature[!i!]=%%a
)
cd .. && cd ..
rem call echo.!Feature[%i%]!
for /L %%N in (1,1,%i%) do (
echo(!Feature[%%N]!|findstr /R /C:"%regexp%" >nul && (
call echo FOUND
call set /a j+=1
call set Feature_Disabled[%j%]=!Feature[%%N]:~0,-2!
call echo.!Feature_Disabled[%j%]!>>Source_List.txt
) || (
call echo NOT FOUND
)
)
endlocal
set "file=%cd%/Config.mak"
set /a i=0
set "regexp=.*:=true$"
setlocal enableDelayedExpansion
IF EXIST Source_List2.txt del /F Source_List2.txt
for /f "usebackq delims=" %%a in ("%file%") do (
set /a i+=1
call set Feature[!i!]=%%a
)
cd .. && cd ..
rem call echo.!Feature[%i%]!
for /L %%N in (1,1,%i%) do (
echo(!Feature[%%N]!|findstr /R /C:"%regexp%" >nul && (
call echo FOUND
call set /a j+=1
call set Feature_Disabled[%j%]=!Feature[%%N]:~0,-6!
call echo.!Feature_Disabled[%j%]!>>Source_List2.txt
) || (
call echo NOT FOUND
)
)
endlocal
然而,还有第三种包含数字(也有一些十六进制值)的行,例如:
这是一条未处理的线:=0xA303
这是一条未处理的线2:=1943
这是未处理的第3行:=你好,你能解析我吗
因此,我需要将这些行提取到另一个.txt文件中,例如:
这是一条未处理的线:=0xA303
这是一条未处理的线2:=1943
这是未处理的第3行:=你好,你能解析我吗
因此,基本上提取不属于以下类型的行:
这是一条未处理的线:=
或
这是一个未处理的行:=true
但是要保持线入口的两边
我知道正则表达式一定有什么诀窍,但我就是找不到。您使代码变得比需要的复杂得多。不需要为文件中的每一行创建数组 如果在第一个
:=
之前没有其他:
或=
,则可以使用FINDSTR
打印包含字符串的所有行,后跟:=
FOR/F
可以捕获每个匹配行并将其解析为:=
之前和之后的部分,然后IF
语句可以对三种不同类型的行进行分类
我使用n>
打开主代码块之外的所有三个输出文件以提高性能,然后使用&n>
语法将每个输出指向适当的、已打开的文件。我使用高编号的文件句柄来避免在中描述的问题
@echo关闭
setlocal
设置“file=Config.mak”
设置/a“空=7,真=8,未处理=9”
%empty%>empty.txt%true%>true.txt%unprocessed%>unprocessed.txt(
对于/f“delims=:=tokens=1*”%%A in('findstr/r“^[^:=][^:=]*:=”“%file%”)do(
如果“%%B”相等(
>&%空%(回声%%A)
)否则如果“%%B”等于“true”(
>&%正确%(回声%%A)
)否则(
>&%未处理%(回显%%A:=%%%B)
)
)
)
上述操作将忽略在:=
之前包含:
或=
的行,如果:=
之后的第一个字符是:
或=
,则无法正常工作。我想这不应该是个问题
使用PowerShell、VBScript或JScript编写一个非常高效的解决方案应该相对容易,从而消除了这些限制
你也可以使用。BAT是纯脚本(混合批处理/JScrpt),从XP开始在任何Windows机器上本机运行,不需要第三方exe。而且JREPL比任何纯批处理解决方案都要快得多,尤其是当文件很大时
下面是一个JREPL解决方案
@echo关闭
setlocal
集回复=^
$txt=false^
如果($2='')标准写入线($1)^
如果($2=='true')标准写入线($1)^
else$txt=$0;
调用jrepl“^(+):=(.*)$”“%repl%”/jmatchq^
/f Config.mak/o unprocessed.txt>empty.txt 2>true.txt
如果您所要做的就是将行分类为三个不同的文件,而不用担心剥离空行和真行的:=true
和:=
部分,那么有一个非常简单的纯批处理解决方案,只使用FINDSTR
@echo关闭
设置“file=Config.mak”
findstr/r“:=$”“%file%”empty.txt
findstr/r“:=true$”%file%>true.txt
findstr/r“:=”“%file%”|findstr/r/v:=$:=true$”>unprocessed.txt
请不要发送垃圾标签:python在这里是不相关的。编辑输出请正确设置您的问题的格式。@Jackson,请尝试将您的问题缩短为可读性更强的内容。我在中间迷路了。。。