
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 enabledelayedexpansion
ermöglicht Ihnen das intelligente Arbeiten mit Variablen in Schleifen.for /f "tokens=*" %%L in (input.txt)
liestinput.txt
jeweils eine Zeile und fügt jede Zeile in die Indexvariable ein%%L
.set line=%%L
kopiert 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. var
istline
offensichtlich.str1
ist*testid
. Das*
ist ein Platzhalter (Mustervergleichssymbol), daher passt dies auf alles bis zum ersten Vorkommen vontestid
inline
. Beachten Sie, dass wir zwarstr1
zu sein*testid=
, aber leider ist es unmöglich fürstr1
enthalten=
, weil=
ist das Trennzeichen zwischenstr1
Undstr2
.str2
ist Null.
Dies ersetzt also alles bis zum ersten Vorkommen von
testid
inline
durch null und gibt alles danach zurücktestid
.- Verwendung
- Wenn die Zeile nicht enthält
testid
, gibt das Obige das gesamteline
unverändert zurück. Wenn alsoline
gleich istright1
, gab es keintestid
in 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 ausright1
.if "!left!" == "="
, das erste Zeichen danachtestid
ist=
, wir haben also gefundentestid=
und möchten die Zeile weiter analysieren.set right2=!right1:~1!
legtright2
allesright1
außer dem ersten Zeichen fest, d. h. nach dem=
.for /f "tokens=1 delims=]" %%W in ("!right2!")
brichtright2
beim 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%%W
ist der Text dazwischen. Sie sollten ihn wahrscheinlich einer regulären Variablen zuweisen.
Offenlegung: Angesichts der Linie
[testid=a] and [testid=b]
Diese Batchdatei findet a
nur; sie findet nicht b
. Angesichts der Zeile
[testid<c] and [testid=d]
die Batchdatei findet nichts, die erste testid
bringt es durcheinander.