Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Suchen ersetzen per batch in einer TXT

Frage Entwicklung Batch & Shell

Mitglied: Compane

Compane (Level 1) - Jetzt verbinden

22.07.2008, aktualisiert 18.10.2012, 24663 Aufrufe, 13 Kommentare

Servus Zusammen

mal eine denke ich mal einfache Frage:

Ich habe eine TXT-Datei die so aussieht:


Datei C:\temp\test.txt
hallo
hello
Datei C:\temp\test2.txt
hallo
hello

aus dieser möchte folgendes entfernen:

Datei C:\temp\


damit es dann so aussieht:

test.txt
hallo
hello
test2.txt
hallo
hello

Es wäre super wenn ihr mir mal wieder halfen könntet!

Grüße

Compane
Mitglied: bastla
22.07.2008, aktualisiert 18.10.2012
Hallo Compane!

Da Du anscheinend diesen Beitrag nicht selbst gefunden hast, eine angepasste Version:
01.
@echo off & setlocal enabledelayedexpansion 
02.
set "Datei=D:\test.txt" 
03.
set "Von=Datei C:\temp\" 
04.
set "Nach=" 
05.
 
06.
set "t=%temp%\text.tmp" 
07.
if exist "%t%" del "%t%" 
08.
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & set "Line=!Line:%Von%=%Nach%!" & >>"%t%" echo !Line! 
09.
move "%t%" "%Datei%"
Grüße
bastla

[Edit] Anführungszeichen bei zweitem "set Line=" ergänzt [/Edit]
Bitte warten ..
Mitglied: Compane
22.07.2008 um 14:45 Uhr
Grüße bastla

ich habe ihn schon gefunden bin aber nicht daraus schlau geworden

Und bin es irgendwie immer noch nicht

Kannst du mir da mal helfen
Bitte warten ..
Mitglied: bastla
22.07.2008 um 14:52 Uhr
Hallo Compane!

Wo liegt das Problem?

Du gibst in den ersten 3 "set"-Zeilen die Datei, den zu ersetzenden und den Ersatzbegriff (in diesem Fall hier eben gar nix) an.

Mittels "for"-Schleife wird jede Zeile der Datei gelesen, innerhalb der Zeile die Ersetzung vorgenommen (Info dazu: "set /?") und die neue Zeile in eine Temp-Datei geschrieben.

Am Ende ersetzt die Temp-Datei die Ausgangsdatei.

Einschränkung: Wenn in den Zeilen "!" enthalten sind, müsste entweder mit einem Unterprogramm oder mit Einbeziehung von VBScript gearbeitet werden.

Grüße
bastla

P.S.: Ich habe noch 2 Anführungszeichen oben nachgetragen ...
Bitte warten ..
Mitglied: Fuddler
24.07.2008 um 18:17 Uhr
Hi bastla,

geniale Lösung!

Ein Wunsch von mir: es wäre schön, wenn Leerzeilen ebenfalls mitkopiert würden.
Geht das irgendwie (bei WinXP/Dos)?

Grüße,
Fuddler
Bitte warten ..
Mitglied: bastla
24.07.2008 um 18:29 Uhr
Hallo Fuddler und willkommen im Forum!

Das sollte dann etwa so gehen:
01.
@echo off & setlocal enabledelayedexpansion 
02.
set "Datei=D:\test.txt" 
03.
set "Von=Datei C:\temp\" 
04.
set "Nach=" 
05.
 
06.
set "t=%temp%\text.tmp" 
07.
if exist "%t%" del "%t%" 
08.
for /f "delims=" %%i in ('findstr /n $ "%Datei%"') do set "Line=%%i" & call :ProcessLine 
09.
move "%t%" "%Datei%" 
10.
goto :eof 
11.
 
12.
:ProcessLine 
13.
for /f "tokens=1* delims=:" %%a in ("%Line%") do set "L=%%b" 
14.
if not defined L >>"%t%" echo\& goto :eof 
15.
>>"%t%" echo !L:%Von%=%Nach%! 
16.
goto :eof
Und ja, die letzte Zeile ist überflüssig (zumindest, solange keine weiteren Zeilen hinzugefügt werden).

Grüße
bastla
Bitte warten ..
Mitglied: Fuddler
24.07.2008 um 19:57 Uhr
Hi Bastla,

nochmals genial!!! Hab ich bislang im Internet noch nicht gefunden! Vielen Dank dafür!
Hab mir erlaubt den Code noch auf 2 oder mehrere Suchen/Ersetzen-Strings aufzupimpen.

Guckst Du: (Ich hoffe, ich formatier das jetzt hier richtig...)

01.
@echo off & setlocal enabledelayedexpansion 
02.
set "Datei=Test.txt"  
03.
set "t=Temp.tmp"  
04.
 
05.
set "Suchen1=aaa" 
06.
set "Ersetzen1=bbb" 
07.
set "Suchen2=ccc" 
08.
set "Ersetzen2=ddd" 
09.
 
10.
if exist "%t%" del "%t%" 
11.
for /f "delims=" %%i in ('findstr /n $ "%Datei%"') do set "Line=%%i" & call :ProcessLine 
12.
move "%t%" "%Datei%" 
13.
goto :WEITER_IM_BATCH 
14.
 
15.
:ProcessLine 
16.
for /f "tokens=1* delims=:" %%a in ("%Line%") do set "L=%%b" 
17.
if not defined L >>"%t%" echo\& goto :eof 
18.
set WriteLine1=!L:%Suchen1%=%Ersetzen1%! 
19.
set WriteLine2=!WriteLine1:%Suchen2%=%Ersetzen2%! 
20.
>>"%t%" echo !WriteLine2! 
21.
goto :eof 
22.
 
23.
:WEITER_IM_BATCH 
24.
....... 
25.
 
Grüße, Fuddler

EDIT: "@echo off & setlocal enabledelayedexpansion" nachgetragen
EDIT: "Test.text"->"Test.txt" und "copy" -> "move"
Bitte warten ..
Mitglied: bastla
24.07.2008 um 20:54 Uhr
Hallo Fuddler!

Noch eine Frage: Warum verwendest Du "copy" anstatt "move"? Falls Du eine Sicherungskopie erstellen möchtest, solltest Du das besser vor dem Ersetzen machen - so hast Du nur zweimal die veränderte Datei ...

Grüße
bastla
Bitte warten ..
Mitglied: Fuddler
24.07.2008 um 21:35 Uhr
Hi Bastla,

hast recht! War nur noch wegen "Debugging" drin

Hab's editiert....

Grüße,
Fuddler
Bitte warten ..
Mitglied: maracapuccino
30.07.2008 um 15:03 Uhr
Dieses Forum ist wirklich erstaunlich.
Dieser Beitrag ist passt schon wunderbar, aber...

Ich benötige mehr als 2 oder 3 "Suchen und Ersetzen Strings". Daher würde ich gerne an diese Batch eine Input Datei übergeben in der z.B Semikolon getrennt die Suchen und Ersetzen Strings stehen.

AlterString1;NeuerString1
AlterString2;NeuerString2
AlterString3;NeuerString3

Diese Datei kann bis zu 1000 Einträge enthalten.
Nicht jeder "alteString" ist in der Ursprungsdatei enthalten, dann soll einfach mit der nächsten Zeile weitergemacht werden. ( Es werden mehrere Quelldateien bearbeitet, in jeder können unterschiedliche "alte Strings" vorkommen.) Der String kann auch mehrfach vorkommen.
In der Quelldatei können die gesuchten Strings beliebig im Text verteilt sein. Es gibt keinen festen Zeilenaufbau.

z.B (Quelltext auszugsweise, ersetzt werden jeweils die Strings hinter "Objektname")

---text-----
Description = ""
components = List
{
AIPD01ref7 = *AIPD01.de
{
ports::UnitColor = "K15"
ports::NormalColor = "K15"
ports::CycleTime = "3s"
ports::ObjectName = "QI11.10ITS"
}
wsDIIndText1ref36 = *wsDIIndText1.de
{
ports::FrameYSize = 1
ports::CycleTime = "3s"
ports::FrameWidth = 1
ports::OffColor = "A11"
ports::OffText = "ATN"
ports::OnColor = "L1"
ports::OnText = "ATN"
ports::ObjectName = "QI11.21ATN"
ports::TextFont = "FC10"
ports::FrameXSize = 3
ports::BackColor = "A1"
ports::ConditionCycle = "onRequest+onEvent"
}
wsDIIndText1ref35 = *wsDIIndText1.de
{
ports::FrameYSize = 1
ports::CycleTime = "3s"
ports::FrameWidth = 1
ports::OffColor = "A11"
ports::OffText = "ATN"
ports::OnColor = "L1"
ports::OnText = "ATN"
ports::ObjectName = "QI11.20ATN"
ports::TextFont = "FC10"
ports::FrameXSize = 3
ports::BackColor = "A1"
ports::ConditionCycle = "onRequest+onEvent"
-----noch mehr text--------- }


Ich bin damit leider überfordert, und für jede Hilfe dankbar.

Grüße MaraCapuccino
Bitte warten ..
Mitglied: bastla
30.07.2008 um 16:32 Uhr
Hallo maracapuccino und willkommen hier im (erstaunlichen ) Forum!

Das könnte so gehen (und ich meine "gehen", denn bei 1000 Ersetzungspaaren gehe ich nicht von "laufen" aus):
01.
@echo off & setlocal enabledelayedexpansion 
02.
set "Datei=D:\Test.txt" 
03.
set "Liste=D:\Ersetzungsliste.txt" 
04.
 
05.
set "t=%temp%\text.tmp" 
06.
if exist "%t%" del "%t%" 
07.
for /f "delims=" %%i in ('findstr /n $ "%Datei%"') do set "Line=%%i" & call :ProcessLine 
08.
move "%t%" "%Datei%" 
09.
goto :eof 
10.
 
11.
:ProcessLine 
12.
for /f "tokens=1* delims=:" %%a in ("%Line%") do set "L=%%b" 
13.
if not defined L >>"%t%" echo\& goto :eof 
14.
for /f "usebackq tokens=1-2 delims=;" %%s in ("%Liste%") do set "L=!L:%%s=%%t!" 
15.
>>"%t%" echo %L% 
16.
goto :eof
Für die Datei "Ersetzungsliste.txt" wird, wie in Deinem Vorschlag oben, ";" als Trennzeichen zwischen altem und neuem Wert verwendet - sollte das Semikolon in einem der Werte selbst vorkommen, müsstest Du ein anderes Trennzeichen suchen und in der Datei und in Zeile 14 des Batches (nach "delims=") verwenden.

Grüße
bastla
Bitte warten ..
Mitglied: maracapuccino
30.07.2008 um 19:31 Uhr
Hallo bastla

Hat super funktioniert. Du hast allerdings recht, bei vielen Ersetzungen dauert das.

Ich habe lange gebraucht um die Batch zu verstehen. Ich habe sie mit Logausgaben gespickt !!!
Gerade die "Token Befehle" sagen mir nicht viel. Auch
"usebackq" wäre erklärungsbedürftig.

Möglicherweise ist das Basiswissen, aber wieso steht in der
Variable %%t der Ersetzungsstring ? Weil "t" alphabetisch nach "s" kommt ? Kann man den Inhalt solcher Variablen in eine Logdatei ausgeben ?

Ansonsten hast du mir sehr weitergeholfen.

Gruß
MaraCapuccino
Bitte warten ..
Mitglied: bastla
30.07.2008 um 20:03 Uhr
Hallo maracapuccino!

Gerade die "Token Befehle" sagen mir nicht viel.
Sieh Dir dazu die Onlinehilfe an:
01.
for /?
Auch "usebackq" wäre erklärungsbedürftig.
In einer "for /f"-Schleife wird der Inhalt der Klammer, wenn er unter doppelten Anführungszeichen steht, als Text interpretiert. Da ich zur Vorsicht neige und daher grundsätzlich Pfadangaben unter Anführungszeichen setze, muss ich mit "usebackq" den Interpreter darüber informieren, dass der zwischen den Anführungszeichen stehende Teil doch wieder als Dateiname zu verstehen ist. Wenn Du sicher bist, dass im Pfad und Dateinamen zur Ersetzungsliste keine Leerzeichen vorkommen werden, kannst Du auf "usebackq" verzichten und in der Klammer einfach %Liste% schreiben.

Möglicherweise ist das Basiswissen, aber wieso steht in der Variable %%t der Ersetzungsstring ? Weil "t" alphabetisch nach "s" kommt ?
So ist es.

Kann man den Inhalt solcher Variablen in eine Logdatei ausgeben ?
Wie für jede andere Variable kannst Du einfach ein "echo" verwenden:
01.
echo %%s %%t>>D:\Logdatei.txt
Und solltest Du Dich darüber wundern, dass ich eine solche Umleitung zB im Batch oben bereits vor dem "echo" schreibe: Diese Variante habe ich (wie so Vieles, was ich über Batch weiß), erstmals hier im Forum, und da natürlich bei Biber gesehen. Sinn des Ganzen ist, zu vermeiden, dass etwa bei der Ausgabe einer Variablen mit dem Inhalt "Stockwerk: 2" mit
01.
echo %Var%>>Textdatei.txt
aufgelöst
01.
echo Stockwerk: 2>>Textdatei.txt
entsteht, was zu einem "Verschlucken" der Ausgabe führen würde, da "2>>" als Umleitung von Fehlermeldungen interpretiert wird, es aber bei diesem "echo" gar keinen Fehler gibt, sodass auch nichts geschrieben werden muss. Mit
01.
>>Textdatei.txt echo %Var%
passiert das nicht.

Grüße
bastla
Bitte warten ..
Mitglied: maracapuccino
01.08.2008 um 21:05 Uhr
Hallo bastla,
Vielen Dank für die wirklich sehr ausführliche und verständliche Auskunft.
Ich hoffe, ich kann eines Tages auch mal irgendjemandem so gut weiterhelfen.

Gruss maracapuccino
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
Suchen, Ersetzen und Entfernen von Dateiinhalten auf Textbasis (1)

Frage von DanteManor zum Thema Batch & Shell ...

Batch & Shell
gelöst Suchen und Ersetzen mehrerer Suchbegriffe per Batch (4)

Frage von makroll10 zum Thema Batch & Shell ...

Batch & Shell
Powershell - In Textdatei suchen und ersetzen (3)

Frage von Raaja89 zum Thema Batch & Shell ...

Batch & Shell
gelöst Textdateien TXT in allen Verzeichnissen suchen und zusammenfassen (19)

Frage von chgs2011 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...