批处理文件 - 删除某个字符前的所有内容

时间:2014-03-31 08:01:13

标签: windows batch-file replace

我有一个这种格式的txt文件:
some text another uninteresting line // some more lines can come here [ actually interesting // this is the stuff I want ]

我希望能够得到方括号[]之间的所有内容(包括括号本身)。

(因为我知道在结束括号后没有文字,所以它只能删除[字符之前的第一行。) 我非常确定我可以使用findStr来完成,但不确定具体如何。

4 个答案:

答案 0 :(得分:1)

您可以使用VBScript。将以下内容另存为extract.vbs

flag=0
Do While Not WScript.StdIn.AtEndOfStream
   Line  = WScript.StdIn.ReadLine()
   If Left(Line,1)="[" Then flag=1 End If
   If flag=1 Then
      WScript.Stdout.WriteLine(Line)
   End If
Loop

然后运行

CSCRIPT /NOLOGO EXTRACT.VBS < YOURFILE

它将标志设置为零,然后一次读取输入文件一直到结束。如果遇到以“[”开头的行,则设置flag = 1。然后它会打印当flag设置为1时找到的每一行。

如果要保存它找到的行,请在新文件中运行,如下所示:

CSCRIPT /NOLOGO EXTRACT.VBS < YOURFILE > NEWFILE

答案 1 :(得分:1)

FINDSTR无法单独解决这个问题。

鉴于您的情况,您只需删除以[开头的行之前的所有行,您只需要以下本机批处理脚本。

@echo off
setlocal
for /f "delims=:" %%N in ('findstr /n [ "file.txt"') do if not defined N set /a N=%%N-1
set "skip="
if %N% gtr 1 set "skip=skip=%N%"
(for /f "usebackq %skip% delims=" %%A in ("file.txt") do echo %%A) >"newFile.txt"

如果你知道你的文件不包含标签,或者标签被转换为空格字符串就可以了,那就更容易了:

@echo off
setlocal
for /f "delims=:" %%N in ('findstr /n [ "file.txt"') do if not defined N set /a N=%%N-1
more +%N% "file.txt" >"newFile.txt"

如果使用REPL.BAT,则解决方案是一个单行程序 - 一个混合JScript /批处理实用程序,它执行正则表达式搜索并替换stdin并将结果写入std out。它是纯脚本,可​​以在任何现代Windows机器上从XP开始本地运行。

假设[只出现一次,那么:

type "file.txt" | repl "[^[]*\[" "[" m >"newFile.txt"

支持方括号之间的多个块甚至很简单,其中[和/或]可能位于一行的中间位置:

type "file.txt" | repl "[^[]*(\[[\s\S]*?\])[^[]*" "$1\r\n" mx >"newFile.txt"

答案 2 :(得分:0)

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "dataFile=data.txt"

rem search the starting line
    set "startLine="
    for /f "tokens=1 delims=:" %%a in (
        'findstr /l /b /n /c:"[" "%dataFile%"'
    ) do if not defined startLine set "startLine=%%a"

rem remove all lines before the starting one    
    if defined startLine for /f "tokens=1,* delims=:" %%a in (
        'findstr /n "^" "%dataFile%" ^& break ^> "%dataFile%"'
    ) do if %%a geq %startLine% >>"%dataFile%" echo(%%b

    endlocal

答案 3 :(得分:0)

如果从适当的操作系统(Unix / Linux)安装某些工具,则无需任何代码即可完成:

grep -A 999 \[ yourfile

这表示在[中查找yourfile个字符并将其打印出来,然后在(-A)后打印最多999行。 Unix Utils免费提供here