使用批处理程序搜索关键字并将偏移内容复制到文件

时间:2014-11-19 10:05:50

标签: windows batch-file search offset

我试图想出一种方法来编写一个Windows批处理程序,它将搜索文件中的关键字。 每次找到关键字时,都会找到内容下面3行的行,并将字母5到12复制到文件中。 使用下面的示例输入文件:

example_input.txt 
bla bla bla bla bla
bla bla bla bla bla
bla keyword bla bla
bla bla bla bla bla
bla bla bla bla bla
bla content1bla bla
bla keyword bla bla
bla bla bla bla bla
bla bla bla bla bla
bla content2bla bla

我希望得到以下输出文件

example_ouput.txt 
content1
content2

在达到内容偏移之前,输入文件永远不会有另一个关键字。 可能需要为每个关键字复制多个内容项。

我搜索并找到了此过程的几个单独元素,但无法将这些元素与工作脚本相结合。因此,我非常感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

我编写了一个名为FindRepl.bat的非常有效的程序,旨在以高级方式查找文件中的字符串。它的使用很简单,您可以在下面的示例会话中看到:

C:\> type input.txt
bla bla bla bla bla
bla bla bla bla bla
bla keyword bla bla
bla bla bla bla bla
bla bla bla bla bla
bla content1bla bla
bla keyword bla bla
bla bla bla bla bla
bla bla bla bla bla
bla content2bla bla

C:\> rem To use FindRepl, redirect to it the input file and insert the search word:

C:\> < input.txt FindRepl "keyword"
bla keyword bla bla
bla keyword bla bla

C:\> rem The /Offset switch allows to define blocks of lines based on found lines:

C:\> < input.txt FindRepl "keyword" /O:+3:+3
bla content1bla bla
bla content2bla bla

C:\> rem Then evaluate a regular expression over such /Block of lines
C:\> rem and show the matched subexpression enclosed in parentheses via /$ switch
C:\> rem (the regexp format is described in noodlesstillalive answer above)

C:\> < input.txt FindRepl "keyword" /O:+3:+3 /B:".{4}(.{8})" /$:1
 "content1"
 "content2"

C:\> rem Quotes are standard when "/$:1" switch is used, so just eliminate they:

C:\> for /F %a in ('^< input.txt FindRepl "keyword" /O:+3:+3 /B:".{4}(.{8})" /$:1') do @echo %~a
content1
content2

您还可以使用FindRepl.bat程序实现一组非常大的不同查找和查找&替换操作;您可以从this site下载。

答案 1 :(得分:0)

假设只有content0到content9,这个正则表达式将起作用。

“内容[0-9]”

Set ShellApp = CreateObject("Shell.Application")
set WshShell = WScript.CreateObject("WScript.Shell")
Set objArgs = WScript.Arguments
Set regEx = New RegExp
Set fso = CreateObject("Scripting.FileSystemObject")
        Set srcfile = fso.GetFile(objArgs(0))
        If err.number = 0 then Set TS = srcFile.OpenAsTextStream(1, 0)
        Src=ts.readall
        regEx.Pattern = objArgs(1) 
        regEx.IgnoreCase = True
        regEx.Global = True
        Set Matches = regEx.Execute(Src)
        For Each Match in Matches
            wscript.echo Match.Value
        Next

使用

cscript //nologo script.vbs "C:\Users\User\Desktop\Callback.txt" "Share[bcd]"
Shared
Shared

如果您想将其重定向到文件中,请进行重定向。

特殊字符和序列用于编写正则表达式的模式。下表描述并给出了可以使用的字符和序列的示例。

字符 说明

  

\    将下一个字符标记为特殊字符或文字。例如,“n”匹配字符“n”。 “\ n”匹配换行符。序列“\”匹配“\”和“(”匹配“(”。

     

^    匹配输入的开头。

     

$    匹配输入的结尾。

     
      
  • 匹配前面的字符零次或多次。例如,“zo *”匹配“z”或“zoo”。

  •   
  • 匹配前一个字符一次或多次。例如,“zo +”匹配“zoo”但不匹配“z”。

  •   
     

?    匹配前面的字符零或一次。例如,“一个?”?匹配“从不”中的“ve”。

     

。    匹配除换行符之外的任何单个字符。

     

(图案)    匹配模式并记住匹配。可以使用Item [0] ... [n]从生成的Matches集合中检索匹配的子字符串。要匹配括号字符(),请使用“(”或“)”。

     

X | Y    匹配x或y。例如,“z | wood”匹配“z”或“wood”。 “(z | w)oo”匹配“zoo”或“wood”。

     

{N}    n是非负整数。正好匹配n次。例如,“o {2}”与“Bob”中的“o”不匹配,但匹配“foooood”中的前两个o。

     

{N,}    n是非负整数。匹配至少n次。例如,“o {2,}”与“Bob”中的“o”不匹配,并匹配“foooood”中的所有o。 “o {1,}”相当于“o +”。 “o {0,}”相当于“o *”。

     

{n,m}    m和n是非负整数。匹配至少n次,最多m次。例如,“o {1,3}”匹配“fooooood”中的前三个o。 “o {0,1}”相当于“o?”。

     

[xyz]    一个字符集。匹配任何一个包含的字符。例如,“[abc]”匹配“plain”中的“a”。

     

[^ xyz]    负字符集。匹配任何未包含的字符。例如,“[^ abc]”匹配“plain”中的“p”。

     

[a-z]    一系列人物。匹配指定范围内的任何字符。例如,“[a-z]”匹配范围“a”到“z”中的任何小写字母字符。

     

[^ m-z]    负范围字符。匹配不在指定范围内的任何字符。例如,“[m-z]”匹配不在“m”到“z”范围内的任何字符。

     

\ b    匹配单词边界,即单词和空格之间的位置。例如,“er \ b”匹配“never”中的“er”而不匹配“verb”中的“er”。

     

\乙    匹配非单词边界。 “ea * r \ B”与“never early”中的“ear”相匹配。

     

\ d    匹配数字字符。相当于[0-9]。

     

\ d    匹配非数字字符。相当于[^ 0-9]。

     

\˚F    匹配换页符。

     

\ n    匹配换行符。

     

\ r    匹配回车符。

     

\ S    匹配任何空格,包括空格,制表符,换页等。相当于“[\ f \ n \ r \ t \ v]”。

     

\ S    匹配任何非白色空格字符。相当于“[^ \ f \ n \ r \ t \ t \ v]”。

     

\吨    匹配制表符。

     

符\ v    匹配垂直制表符。

     

\瓦特    匹配任何单词字符,包括下划线。相当于“[A-Za-z0-9_]”。

     

\ W    匹配任何非单词字符。相当于“[^ A-Za-z0-9_]”。

     

\ NUM    匹配num,其中num是正整数。回顾记住的比赛的参考。例如,“(。)\ 1”匹配两个连续的相同字符。

     

\ n    匹配n,其中n是八进制转义值。八进制转义值必须为1,2或3位数。例如,“\ _11”和“\ 011”都匹配制表符。 “\ 0011”相当于“\ 001”&amp; “1”。八进制转义值不得超过256.如果满足,则只有前两位包含表达式。允许ASCII代码用于正则表达式。

     

\ XN    匹配n,其中n是十六进制转义值。十六进制转义值必须正好是两位数。例如,“\ x41”匹配“A”。 “\ x041”相当于“\ x04”&amp; “1”。允许ASCII代码用于正则表达式。

答案 2 :(得分:0)

Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
Do Until Inp.AtEndOfStream
    Line=Inp.readline
    If Instr(Line,"keyword") <> true then 
        Line = Inp.Readline
        Line = Inp.Readline
        Line = Mid(Inp.Readline, 5, 7)
        Outp.writeline Line 
Loop

这个使用重定向。

cscript //nologo script.vbs <inputfile.txt >outputfile.txt

答案 3 :(得分:0)

好的..问题解决了! 我关闭了If然后,并将条件从true更改为0,我现在得到一个合理的输出。

工作脚本如下所示:

Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
Do Until Inp.AtEndOfStream
    Line=Inp.readline
    If Instr(Line,"keyword") <> 0 then 
        Line = Inp.Readline
        Line = Inp.Readline
        Line = Mid(Inp.Readline, 5, 7)
        Outp.writeline Line
    End If
Loop

执行语法如下(不需要更改):

cscript //nologo script.vbs <inputfile.txt >outputfile.txt

谢谢面条!