我有一个这种格式的txt文件:
some text
another uninteresting line
// some more lines can come here
[ actually interesting
// this is the stuff I want
]
我希望能够得到方括号[]之间的所有内容(包括括号本身)。
(因为我知道在结束括号后没有文字,所以它只能删除[
字符之前的第一行。)
我非常确定我可以使用findStr
来完成,但不确定具体如何。
答案 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。