Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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 为什么cmd findstr中的正则表达式可以工作?_Regex_Batch File_Cmd_Findstr - Fatal编程技术网

Regex 为什么cmd findstr中的正则表达式可以工作?

Regex 为什么cmd findstr中的正则表达式可以工作?,regex,batch-file,cmd,findstr,Regex,Batch File,Cmd,Findstr,我需要创建一个cmd脚本(不知怎么做了),从一系列文件中提取一些文本行,并将它们放入一个新的txt文件中 源文件如下所示: % ! ! AAA ! ! ------------------------ SOME TEXT ABCDEFGHIJKLMN -------------------------- ! ! BBB ! ---------------------------------------------------------------------------- ! T5 PUNTA

我需要创建一个cmd脚本(不知怎么做了),从一系列文件中提取一些文本行,并将它们放入一个新的txt文件中

源文件如下所示:

%
!
! AAA
!
! ------------------------ SOME TEXT ABCDEFGHIJKLMN --------------------------
!
! BBB
! ----------------------------------------------------------------------------
! T5 PUNTA ø 6.5/9.5~  $ 63~
! ----------------------------------------------------------------------------
! T12 PUNTA ø 2.5~  $ 39~
! ----------------------------------------------------------------------------
! 
! SOME OTHER TEXT
! 
!  1]  ABC
!  2]  DEF
!  3]  ...

OTHER LINE 1
OTHER LINE 2
ETC

%
我需要提取的行是介于两个
之间的行!--------------------------------------------------------------------------------------“
因此,在本例中,
T5蓬塔ø6.5/9.5~$63~
T12蓬塔ø2.5~$39~

我尝试了一些带有
findstr
的正则表达式来匹配一行
仅在相关行之后,这表示搜索结束,直到我(纯粹出于偶然)找到一条与所有且仅与我需要的行匹配的指令(我猜是运气)

片段如下所示:

@echo off
setlocal enabledelayedexpansion
if exist output.txt ( break > output.txt )
for /r <path> %%g in (<filename>) do (
    ...
    for /f "tokens=* delims= " %%a in (%%g) do (
        echo %%a | findstr /r /c:^\!$ >nul
        if errorlevel 1 (...)
        ) else ( echo %%a >> srcoutput.txt
            ...
        )
    )
)
@echo关闭
延迟扩展
如果存在output.txt(break>output.txt)
对于/r%%g in()do(
...
对于/f“tokens=*delims=“%%a in(%%g)do(
echo%%a | findstr/r/c:^\!$>nul
如果错误级别为1(…)
)else(echo%%a>>srcoutput.txt
...
)
)
)
请关注指令
echo%%a | findstr/r/c:^\!$>nul
。 出于某种原因,我不知道,这只与
T5蓬塔ø6.5/9.5~$63~
T12蓬塔ø2.5~$39~
行匹配。这正是我想要的,但我不知道为什么它会起作用

有人能帮我理解为什么这个简单的表达式
^\$有效吗?
在我(错误)的理解中,它应该只匹配一行和一个
(我已经转义了,因为否则它不起作用)在开始和结束时


提前谢谢你

实际上是comand热线:

echo%%a | findstr/r/c:^\!$>努尔
只返回包含
$
-字符的行

这是一步一步发生的:

  • 命令行被解析为(假设
    %%a
    保持
    ):

    echo | findstr/r/c:\!$>努尔
    
    因此,(无引号的)插入符号(
    ^
    )消失,因为它是
    cmd
    的转义字符;既然
    \
    没有特殊的含义,你可以省略
    ^

  • 由于启用了延迟扩展(实际上是不必要的),因此
    -符号消失,因为只有一个,因此命令行变为:

    echo | findstr/r/c:\$>nul
    
  • \
    -符号充当转义字符(尽管特别适用于
    findstr
    !),因此
    $
    -符号在正则表达式(
    /R
    )模式中失去其特殊意义(即将匹配锚定到行尾),因此被视为文字字符

  • 管道的左侧通过文本
    (后面有一个空格,因为
    |
    前面有一个空格),右侧最终搜索文本中的文字
    $
    -字符

使用以下命令行可以获得完全相同的结果:

echo%%a | findstr/C:$>nul
尽管我更愿意这样写:

回声(%%a | findstr/C:“$”>nul
避免尾随空格并安全地回显任何文本


对于这项任务,我可能会选择另一种方法(请参阅所有解释性
rem
备注):

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“\u ROOT=D:\Target\Path”&rem/(根目录的路径)
设置“_MASK=*.txt”&rem//(要处理的文件的名称或掩码)
设置“\u SAVE=D:\Path\To\output.txt”&rem/(输出文件的位置)
rem//收集换行符:
(一套)=^
%=空行=%
^")
rem//聚集回车符:
对于/F%%C in('copy/Z“%~f0“nul'),请设置“\u CR=%%C”
rem//只打开一次输出文件并写入:
>“%\u保存%”(
rem//查找匹配的文件并在其中循环:
对于(“%\u掩码%”)中的/R“%\u根%”%%F,请执行以下操作(
rem//检查文件是否存在(仅在指定专用名称时才需要):
如果存在“%%~F”(
rem//当前文件的存储路径:
设置“文件=%%~F”
rem//切换延迟扩展以避免出现“!”问题:
setlocal EnableDelayedExpansion
rem//删除剩余的引号(仅在提供专用名称时才需要):
设置“文件=!文件:”=!
rem/*通过“findstr”执行多行搜索,它只返回第一行;
rem搜索的字符串为:
rem#固定在一条线的开头,
rem#一个`!`,一个空格和一个` T`,然后
rem#一些任意文本(没有换行符),然后
rem#一个换行符,然后是另一个“!”和一个空格,然后
rem#一个或多个“-”的序列,
rem#固定在一条线的末端;
仅返回显式换行符之前的部分:*/
findstr/R/C:“^^^!T.*~!\u CR!!\u LF!^!-*$”!文件!”
端部
)
)
)
端部
退出/B
这并不确切地搜索
!--
等之间的行,但它搜索两个相邻行,其中第一行以
+空格+
T
开始,以
~
结束,第二行由
+空格+一个或多个
-
序列组成


如果输入文件包含Unix-/Linux风格的换行符,而不是DOS-/Windows风格的换行符,请将脚本中的
搜索字符串中的
!\u CR!!\u LF!
替换为
!\u LF!

,我决定将此作为实现预期目标的一种潜在方法。它使用的方法与当前的被接受的答案是,检索
!----等
行号,然后反求