2017-06-27 3 views
0

Ich habe eine Menge von TXT-Dateien, die Informationen wie diese hat:Schneiden Sie den Text in Klammern aus txt im Batch

randomtext[IMPORTANTTEXT]morerandomtext 

Wie kann ich ohne die Klammern den wichtigen Text ausgeschnitten und vielleicht Überschreiben Sie die ursprüngliche TXT im Stapel?

+3

'['/']' sind (Quadrat) Klammern, '{'/'}' sind in der Regel als Klammern bezeichnet. Wie auch immer, hast du selbst etwas probiert? Haben Sie schonmal von dem Befehl "for/F" gehört (http://ss64.com/nt/for_f.html)? – aschipfl

+0

Ja, ich habe ein paar Dinge versucht, und versuche eine Antwort zu finden, aber ich bin nicht wirklich mit Batch vertraut. Ich verstehe die Trennzeichen nicht und wie Sie die Schleife verwenden, um in Text zu navigieren –

+1

Können sie mehrere "wichtige Teile" in derselben Zeile haben? – Regejok

Antwort

0

Das Folgende wird auch mehrere Instanzen in der gleichen Zeile tun. Ich überlasse es Ihnen, es zu ändern, um einen Pfad für die * .txt-Dateien zu verwenden.

Testdaten:

Test1.txt 
randomtext[IMPORTANTTEXT1a]morerandomtext 
randomtext[IMPORTANTTEXT1b]morerandomtext 

Test2.txt 
randomtext[IMPORTANTTEXT2]morerandomtext 
randomtext[IMPORTANTTEXT2a]morerandomtext randomtext[IMPORTANTTEXT2b]morerandomtext 

Batch-Datei:

@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 

rem For each text file in the current directory... 
for /f "tokens=*" %%F in ('dir /b *.txt') do (
    set FileSpec=%%F 

    rem For each line of text in the file that has at least one [ 
    for /f "tokens=1,* delims=[" %%a in (!FileSpec!) do (
     rem This line of text has a [ so get the important text. %%a[%%b 
     rem below passes the entire line of text. 
     call :FindImportantText %%a[%%b 
    ) 
) 
ENDLOCAL 
pause 
exit /b 

:FindImportantText 
for /f "tokens=1,* delims=[" %%c in ("%*") do (
    rem The "%*" above is the entire line of text even if it contains 
    rem spaces which would normally delimit the line into pieces 
    if not "%%d"=="" (
     rem There is a [ and text following the [. %%d is the portion 
     rem following the [. 

     rem so find the ending ] 
     for /f "tokens=1,* delims=]" %%e in ("%%d") do (
      if not "%%f"=="" (
       rem We have an ending ] so show it 
       echo ImportantText in !FileSpec!=%%e 

       rem Try again with the remaining portion of the line 
       call :FindImportantText %%f   
      ) 
     ) 
    ) 
) 
exit /b 
0

Dadurch werden die Teile zwischen dem ersten Paar von Klammern herauszufiltern:

for /f "tokens=2 delims=[]" %%a in ('type %1') do echo.%%a>>%2 

Wenn es Zeilen ohne „wichtige Teile“, können Sie sie mit findstr oder durch Prüfen, ob die Ausgabe leer überspringen kann, ist:

for /f "tokens=2 delims=[]" %%a in ('type %1') do if "%%a" neq "" echo.%%a>>%2 

Um alle TXT-Dateien im aktuellen Verzeichnis, rufen Sie die Schleife mit einer anderen Schleife zu verarbeiten:

@echo off 
for %%a in (*.txt) do call :brekkies "%%a" "%%~na_out.txt"&echo.%%a 
echo.done. 
exit /b 

:brekkies 
for /f "tokens=2 delims=[]" %%a in ('type %1') do if "%%a" neq "" echo.%%a>>%2 

Dateien werden "[name] _out.txt" benannt.

+1

Wenn Sie nur einen Token (2) haben, gibt es kein '%% b', nur' %% a' ... – Stephan

+0

@Stephan Redigiert zu schnell, danke für die Benachrichtigung. – Regejok

Verwandte Themen