在文本文件中的两个单词之间获取文本

时间:2016-04-05 03:14:32

标签: windows batch-file findstr

为了简洁起见,我有一个文本文件(在Windows中),如下所示:

Blah Blah Blah Blah
Blah Blah Blah 2016
START-OF-FILE
ABC
ABCDE Blah Blah Blah
Blah Blah Blah Blah
Blah Blah Blah Blah Blah Blah
END-OF-FILE
Blah Blah Blah
Blah Blah Blah

我只想要START-OF-FILE和END-OF-FILE

之间的文本
ABC
ABCDE Blah Blah Blah
Blah Blah Blah Blah
Blah Blah Blah Blah Blah Blah

我尝试使用Findstr,但效果不佳。有人可以帮忙吗?

这是我到目前为止所做的:

@echo off
setlocal enabledelayedexpansion

set quote=

for /f "tokens=*" %%a in (infile.txt) do (
  set str=%%a
  set str=!str:"=:!

  if not "!str!"=="!str::=!" (
    if defined quote (
      set quote=
      for %%b in (^"%%a) do set str=%%~b
      if not "!str!"==START-OF-FILE if not "!str: =!"==END-OF-FILE echo !str! >> outfile.txt
    ) else (
      set quote=1
      for %%b in (%%a^") do set str=%%~b
    )
  )

  if defined quote (
    if not "!str!"==START-OF-FILE if not "!str: =!"==END-OF-FILE echo !str! >> outfile.txt
  )
)

这就是结果:

2016" 
START-OF-FILE 
ABC
ABCDE Blah Blah Blah
Blah Blah Blah Blah
Blah Blah Blah Blah Blah Blah
END-OF-FILE
Blah Blah Blah

我需要2016年" ,文件开头,文件结束和文件结束后(Blah Blah Blah)不包括在内

4 个答案:

答案 0 :(得分:2)

@echo off
setlocal EnableDelayedExpansion

set "skip="
for /F "delims=:" %%a in ('findstr /N "START-OF-FILE END-OF-FILE" input.txt') do (
   if not defined skip (
      set "skip=%%a"
   ) else (
      set /A "lines=%%a-skip-1"
   )
)
(for /F "skip=%skip% delims=" %%a in (input.txt) do (
   echo %%a
   set /A lines-=1
   if !lines! equ 0 goto break
)) > output.txt
:break

答案 1 :(得分:1)

emcc --shell-file <path>

您需要更改@ECHO OFF SETLOCAL SET "sourcedir=U:\sourcedir" SET "destdir=U:\destdir" SET "filename1=%sourcedir%\q36416492.txt" SET "outfile=%destdir%\outfile.txt" SET "output=" ( FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO ( IF "%%a"=="END-OF-FILE" SET "output=" IF DEFINED output ECHO(%%a IF "%%a"=="START-OF-FILE" SET "output=Y" ) )>"%outfile%" GOTO :EOF sourcedir的设置以适合您的具体情况。

我使用了一个名为destdir的文件,其中包含我的测试数据。

生成定义为%outfile%

的文件

使用q36416492.txt解释变量的运行时值的事实。

读取文件的每一行,如果ON-触发字符串匹配,则将if defined设置为一个值,并清除OFF-触发字符串。如果定义了标志output,则仅对该行进行反刍。

答案 2 :(得分:0)

您可以使用

String result = "";
boolean withinBounds = false;
for (int i = 0; i < lines.length; i++) {
 if (lines[i].equals("START-OF-FILE")) {
  withinBounds = true;
 }
 if (lines[i].equals("END-OF-FILE")) {
  withinBounds = false;
 }
 if (withinBounds) {
  //do whatever you want to do with the lines between your tags here
  result = result + lines[i] + "\n";
 }
}

将文件的所有行作为数组。从那里可以很容易地遍历它们并找到你想要的那些。

import fs from 'fs'


myFunc = function(){

    fs.readFile('input.txt', function(err, data){
        if(err)
            console.log("Error" + err)

        console.log("Data from input" + data)
    })

}

请注意,这是未经测试的,但一般概念绝对适用于您。请注意,它还假设您的标签本身就是一行。

答案 3 :(得分:0)

使用Windows Powershell

如果您知道起点和终点,这将是一个两步过程。第一行切断顶部,第二行切断底部。

获取内容 file.txt |选择-last n &gt; output.txt

获取内容 output.txt | select -first n &gt; output2.txt

如果您不知道起点和终点在哪里,则需要两次额外的步骤......

输入 file.txt | select-string -pattern &#34; START_OF_FILE&#34; | Select-Object LineNumber

输入 file.txt | select-string -pattern &#34; END_OF_FILE&#34; | Select-Object LineNumber