Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何从txt文件中减去字符串和非空值项?_Regex_Parsing_Batch File - Fatal编程技术网

Regex 如何从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

我有一个脚本,可以提取以下行:

这是一条线:=

这是第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 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,请尝试将您的问题缩短为可读性更强的内容。我在中间迷路了。。。