Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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
Parsing 如何批量获取包含令牌的整个短语_Parsing_Batch File - Fatal编程技术网

Parsing 如何批量获取包含令牌的整个短语

Parsing 如何批量获取包含令牌的整个短语,parsing,batch-file,Parsing,Batch File,我的批处理文件应该将包含dog. 例如,假设输入文件为: dog.house, asdasd dog.dinner dog.hello 结果应该是: dog.house dog.dinner dog.hello 到目前为止,我的批处理文件是: for /F "tokens=*" %%a in ('findstr /c condor. temp.txt') do echo %%a >> resultado.txt 但是返回整行,而不是包含“dog”的短语。 我很难理解批处理是如何

我的批处理文件应该将包含
dog.

例如,假设输入文件为:

dog.house, asdasd dog.dinner
dog.hello
结果应该是:

dog.house
dog.dinner
dog.hello
到目前为止,我的批处理文件是:

for /F "tokens=*" %%a in ('findstr /c condor. temp.txt') do echo %%a >> resultado.txt
但是返回整行,而不是包含“dog”的短语。
我很难理解批处理是如何工作的。

是的,循环的
很棘手
for
不带任何开关,在一行上逐字解析
for/f
逐行循环,必要时使用标记作为单词。你需要的是两者的结合

@echo off
for /f "delims=" %%I in ('findstr /i "dog\." temp.txt') do (
    for %%a in (%%I) do (
        echo %%a | findstr /i "dog\."
    )
)
这会给你带来你期望的结果

示例结果

C:\Users\me\Desktop>type temp.txt
dog.house, asdasd dog.dinner
dog.hello

C:\Users\me\Desktop>test.bat
dog.house
dog.dinner
dog.hello

是的,
for
循环很棘手
for
不带任何开关,在一行上逐字解析
for/f
逐行循环,必要时使用标记作为单词。你需要的是两者的结合

@echo off
for /f "delims=" %%I in ('findstr /i "dog\." temp.txt') do (
    for %%a in (%%I) do (
        echo %%a | findstr /i "dog\."
    )
)
这会给你带来你期望的结果

示例结果

C:\Users\me\Desktop>type temp.txt
dog.house, asdasd dog.dinner
dog.hello

C:\Users\me\Desktop>test.bat
dog.house
dog.dinner
dog.hello

您可以使用有关FOR命令的良好教程。我最喜欢的是

只要文件不包含
*
字符,rojo就有一个很好的解决方案。FOR循环在
处打断“短语”,和
=
。这里有一个稍微高效的版本,它通过FINDSTR的一次迭代来传递所有“短语”。我还使用了晦涩的语法来禁用DELIMS和EOL,以保留以
开头的行

@echo off
setlocal
cmd /c "for /f delims^=^ eol^= %%I in ('findstr /c:"dog." test.txt') do @for %%a in (%%I) do @echo %%a" | findstr /c:"dog." >resultado.txt
*
限制可以通过抛弃简单的FOR来解决,并使用search and replace将
替换为
空间
,并通过FINDSTR返回结果。有一些语法可以成批地完成这项工作。但这只会让解决方案变得更慢:(

不过,我怀疑速度的提高是否足够。您可以按照rojo的建议下载并使用grep,也可以切换到更好的脚本语言,如VBScript、JScript或PowerShell

编辑

有时您无法将可执行文件下载到计算机上,并且您可能不习惯使用其他脚本语言

我已经编写了一个名为REPL.BAT的混合批处理/JScript实用程序,它可以执行regex搜索和替换。它可以在所有现代Windows计算机上工作,并且不需要任何安装过程。只要REPL.BAT位于当前文件夹中,或者在路径中的某个位置,那么下面的简单行就可以满足您的需要。它使用REPL.BAT将所有空格转换为换行符,然后将结果传输到FINDSTR。此解决方案应该非常快速

repl.bat " " "\n" x <temp.txt | findstr /c:"dog." >resultado.txt

关于FOR命令,您可以使用一个很好的教程。我最喜欢的是

rojo有一个很好的解决方案,只要文件不包含
*
字符。FOR循环在
=
处打断“短语”。下面是一个稍微有效的版本,它可以将所有的“短语”进行管道传输通过FINDSTR的一次迭代,我还使用了晦涩的语法来禁用DELIMS和EOL,以保留以
开头的行

@echo off
setlocal
cmd /c "for /f delims^=^ eol^= %%I in ('findstr /c:"dog." test.txt') do @for %%a in (%%I) do @echo %%a" | findstr /c:"dog." >resultado.txt
*
的限制可以通过抛弃简单的FOR来解决,使用search and replace将
替换为
空格
,并通过FINDSTR回显结果。有语法可以成批执行。但这只会使解决方案变得更慢:(

不过,我怀疑速度的提高是否足够。您可以按照rojo的建议下载并使用grep,也可以切换到更好的脚本语言,如VBScript、JScript或PowerShell

编辑

有时您无法将可执行文件下载到计算机上,并且您可能不习惯使用其他脚本语言

我已经编写了一个名为REPL.BAT的混合批处理/JScript实用程序,它可以执行regex搜索和替换。它可以在所有现代Windows计算机上工作,并且不需要任何安装过程。只要REPL.BAT位于当前文件夹中,或者在路径中的某个位置,那么下面的简单行就可以满足您的需要。它使用REPL.BAT将所有空格转换为换行符,然后将结果传输到FINDSTR。此解决方案应该非常快速

repl.bat " " "\n" x <temp.txt | findstr /c:"dog." >resultado.txt

为了问题的一致性,我假设您打算
findstr/c:“dog.”temp.txt
您可以使用一个关于FOR命令的好教程。为了问题的一致性,我最喜欢的是我假设您打算
findstr/c:“dog.”temp.txt
您可以使用一个很好的FOR命令教程。我最喜欢的是+1,只要内容不包含
*
字符。@dbenham-是的。
grep
会让它更容易。
grep-P-o“dog\。\w*“temp.txt
然后去喝杯啤酒。可惜findstr不是那样工作的。谢谢,它工作得很好。但是它太慢了。这与批处理性能有关吗?@Erandros-它基本上是针对包含“dog”的每一行运行的。针对每个单词运行
findstr
,测试“dog”如果您是针对大型数据文件运行此操作,并且速度是一个问题,那么最好从中获取
grep
(binaries.zip文件应该足够了)并在我上面的评论中使用该命令。它可能会更快。@rojo-grep建议是完美的,只要OP能够安装一个可执行文件。我在回答中添加了一个本机Windows fast解决方案-REPL.BAT的另一个用途:)+1、好的解决方案,只要内容中不包含
*
字符。@dbenham-是的。
grep
会使它更容易。
grep-P-o“dog\。\w*temp.txt
然后去喝杯啤酒。可惜findstr不是那样工作的。谢谢,它能工作。但是它太慢了。这与批处理性能有关吗?@Erandros-I