0

我正在尝试使用 DOS 命令从命令行中的一行解析一个单词

如果字符串包含 _(" 那么我想将它存储在一个文件中。例如:

   js\.svn\text:        $errors=      '</b> - ' . _("LABEL") . ' '      . _('ERR

如果没有,那么我想继续忽略它。

我很难弄清楚 delim 是如何工作的,或者我是否应该为此使用它。我看到很多关于输出整行的例子,但不是字符串。

或者......我在想可以通过每个单词查看for循环,直到该行中不再有......如果单词开头匹配_(“那么我会将它输出到文件中?

像这样的东西?

 for /F "tokens=1*" %%i in (get_list.txt) do(
   for %%A in (%%j) do(
      if (%%A == "_("")) >> get_id.txt
  )
 )  

有人可以纠正我的语法或以任何方式指导我吗?

4

2 回答 2

0

不需要外部实用程序或“FOR”。试试这条线:

 >get_id.txt findstr _(\" get_list.txt

\ “转义” Quotesign。以下行将不起作用:

 findstr _(\" get_list.txt >get_id.txt
于 2013-03-18T16:35:43.457 回答
0

编辑

重新阅读您的问题后,我不完全确定您想要什么。您是说要将整行转储到文本文件中,而不仅仅是匹配项?

我也不清楚其他事情。是否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:^)=!
        )
    )
)
于 2013-03-18T13:07:08.610 回答