编辑
重新阅读您的问题后,我不完全确定您想要什么。您是说要将整行转储到文本文件中,而不仅仅是匹配项?
我也不清楚其他事情。是否get_list.txt
包含 PHP-ish 代码,或者它是否包含您要检查 PHP-ish 代码的文件列表?
如果get_list.txt
是代码并且您希望将匹配的行转储到get_id.txt
,那么您只需要findstr "_(" "get_list.txt" >> "get_id.txt"
.
以下答案是根据我最初的假设提交的,即您想要的get_id.txt
只是完全匹配,例如match
字符串 _(" match
" 中的单词。
路径 1
好吧,如果我是你,我会使用grep -o来执行此操作。可以使用 for 循环完成,但使用 grep 可以更轻松地完成。
grep -P -o "(?<=_\([\'\"])\w+" get_list.txt >> get_id.txt
...如果您要捕获的内容将始终用引号引起来,或者...
grep -P -o "(?<=_\()[^\)]+" get_list.txt | grep -P -o "\w+" >> get_id.txt
...如果可能有一些未引用的整数、布尔值或其他未引用的数据类型。
路径 2
如果您坚持使用普通的批处理脚本,那么第二个最有效的方法是使用 JScript 混合脚本来利用 JScript 的正则表达式匹配。
@if (@x==@y) @end /*
:: batch portion
@echo off
setlocal
for /f "delims=" %%I in ('findstr "_(" "get_list.txt"') do (
cscript /nologo /e:jscript "%~f0" %%I >> get_id.txt
)
goto :EOF
:: JScript portion */
var m=WSH.arguments(0).match(/_\([\'\"]?\w+/g);
for (var i=0; i<m.length; i++ ) {
WSH.echo(m[i].replace(/_\([\'\"]?/,''));
}
路径 3
如果您真的想像示例中那样逐字解析文本文件,我认为这是您正在寻找的语法。如果您的文本文件很大,我认为这将是最慢的解决方案,因为批处理循环有时会非常慢。
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%I in ('findstr "_(" "get_list.txt"') do (
for %%x in (%%I) do (
set word=%%x
set word=!word:_^(=!
if not !word!==%%x (
set word=!word:"=!
set word=!word:'=!
>> get_id.txt echo !word:^)=!
)
)
)