So extrahieren Sie über ein Batch-Skript einen Teil einer Zeile, der zwischen zwei bestimmten Zeichenfolgen liegt

So extrahieren Sie über ein Batch-Skript einen Teil einer Zeile, der zwischen zwei bestimmten Zeichenfolgen liegt

Ich versuche, Zeichenfolgen zu extrahieren, die zwischen testid=und liegen ].

Eingabetextdatei

SEVERE  TEST 11/18/2019 8:00:41 AM  Could not find INPUT with [testid=2345]
SEVERE  TEST 11/18/2019 5:02:11 AM  Could not find INPUT with [testid=12345678]

Erwartete Ausgabe

2345
12345678

Antwort1

Versuche dies,

@echo off
for /F "tokens=* USEBACKQ" %%F in (`findstr /I /C:"8:00:41" text.txt`) do (
set string=%%F
)
set string=%string:~68%
set string=%string:~,-1%
echo %string%
for /F "tokens=* USEBACKQ" %%F in (`findstr /I /C:"5:02:11" text.txt`) do (
set string2=%%F
)
set string2=%string2:~68%
set string2=%string2:~,-1%
echo %string2%
pause

Sie erhalten folgende Ausgabe:

2345
12345678
Press any key to continue...

Wenn Sie das letzte Stück loswerden möchten, ersetzen Sie die

pause

am Ende mit einem

pause > nul

und die Ausgabe, die Sie erhalten, ist

2345
12345678

Antwort2

Sie können dies mit einer Batchdatei tun, indem Sie Regex in vbscript verwenden:

@echo off
Title Extract Data between string and char from a text file using RegExp
Set "InputFile=Test.txt"
Set "OutputFile=OutputFile.txt"
Call :ExtractData "%InputFile%" "%OutputFile%"
If Exist %OutputFile% Start "" %OutputFile%
Exit
::-----------------------------------------------------------------------------------
:ExtractData <InputFile> <OutputFile>
(
    echo WScript.StdOut.WriteLine Extract("%~1"^)
    echo Function Extract(Data^)
    echo Dim strPattern,strResult,oRegExp,Match,colMatches 
    echo Data = WScript.StdIn.ReadAll
    echo strPattern = "\[testid=(.+)\]"
    echo Set oRegExp = New RegExp
    echo oRegExp.Global = True
    echo oRegExp.Multiline = True
    echo oRegExp.IgnoreCase = True 
    echo oRegExp.Pattern = strPattern
    echo set colMatches = oRegExp.Execute(Data^)
    echo For Each Match in colMatches
    echo    strResult = strResult ^& Match.SubMatches(0^) ^& vbcrlf
    echo Next
    echo Extract = strResult
    echo End Function
)>"%tmp%\%~n0.vbs"
cscript //nologo "%tmp%\%~n0.vbs" < "%~1" > "%~2"
If Exist "%tmp%\%~n0.vbs" Del "%tmp%\%~n0.vbs"
Exit /B
::----------------------------------------------------------------------------------

Die Ausgabedatei sieht wie folgt aus:

2345
12345678

Antwort3

Diese Batchdatei extrahiert den Text zwischen (der ersten) testid= Zeile (sofern vorhanden) und der (ersten) nachfolgenden Zeile ](sofern vorhanden), unabhängig davon, wo in der Zeile sie erscheinen, mit einer Ausnahme, die ich identifizieren konnte (siehe unten in der Antwort):

@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%L in (input.txt) do (
    set line=%%L
    set right1=!line:*testid=!
    if not !line! == !right1! (
        set left=!right1:~0,1!
        if "!left!" == "=" (
            set right2=!right1:~1!
            for /f "tokens=1 delims=]" %%W in ("!right2!") do (
                if not %%W == !right2! (
                    echo.%%W
                )
            )
        )
    )
)
  • setlocal enabledelayedexpansionermöglicht Ihnen das intelligente Arbeiten mit Variablen in Schleifen.
  • for /f "tokens=*" %%L in (input.txt)liest input.txtjeweils eine Zeile und fügt jede Zeile in die Indexvariable ein %%L.
  • set line=%%Lkopiert den Text in eine reguläre Variable, die einfacher zu bearbeiten ist.
  • set right1=!line:*testid=! verwendet die Syntax für eine Zeichenfolgenersetzung in einer Variablenerweiterung (zur Vereinfachung wurden Leerzeichen hinzugefügt).% var : str1 = str2 %

    • Verwendung !anstelle von %aufgrund der verzögerten Erweiterung.
    • varist lineoffensichtlich.
    • str1ist *testid. Das  *ist ein Platzhalter (Mustervergleichssymbol), daher passt dies auf alles bis zum ersten Vorkommen von testidin  line. Beachten Sie, dass wir zwarstr1zu sein *testid=, aber leider ist es unmöglich fürstr1enthalten =, weil =ist das Trennzeichen zwischenstr1Und str2.
    • str2ist Null.

    Dies ersetzt also alles bis zum ersten Vorkommen von testidin  linedurch null und gibt alles danach zurück testid.

  • Wenn die Zeile nicht enthält testid, gibt das Obige das gesamte lineunverändert zurück. Wenn also linegleich ist right1, gab es kein testidin der Zeile. Wenn sie unterschiedlich sind, fahren Sie mit der Analyse dieser Zeile fort.
  • set left=!right1:~0,1!extrahiert das erste (ganz linke) Zeichen aus right1.
  • if "!left!" == "=", das erste Zeichen danach testidist =, wir haben also gefunden testid=und möchten die Zeile weiter analysieren.
  • set right2=!right1:~1!legt right2alles right1 außer dem ersten Zeichen fest, d. h. nach dem  =.
  • for /f "tokens=1 delims=]" %%W in ("!right2!")bricht right2beim ersten auseinander ]und fügt den Text davor ]in ein %%W.
  • Wenn ja %%W == !right2!, dann stand keins ]in der Zeile.
  • Wenn wir testid=und gefunden haben ], dann %%Wist der Text dazwischen. Sie sollten ihn wahrscheinlich einer regulären Variablen zuweisen.

Offenlegung: Angesichts der Linie

[testid=a] and [testid=b]

Diese Batchdatei findet anur; sie findet nicht b. Angesichts der Zeile

[testid<c] and [testid=d]

die Batchdatei findet nichts, die erste testidbringt es durcheinander.

verwandte Informationen