Regex 为什么cmd findstr中的正则表达式可以工作?
我需要创建一个cmd脚本(不知怎么做了),从一系列文件中提取一些文本行,并将它们放入一个新的txt文件中 源文件如下所示:Regex 为什么cmd findstr中的正则表达式可以工作?,regex,batch-file,cmd,findstr,Regex,Batch File,Cmd,Findstr,我需要创建一个cmd脚本(不知怎么做了),从一系列文件中提取一些文本行,并将它们放入一个新的txt文件中 源文件如下所示: % ! ! AAA ! ! ------------------------ SOME TEXT ABCDEFGHIJKLMN -------------------------- ! ! BBB ! ---------------------------------------------------------------------------- ! T5 PUNTA
%
!
! 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!
,,我决定将此作为实现预期目标的一种潜在方法。它使用的方法与当前的被接受的答案是,检索!----等
行号,然后反求