Top-Themen

Aktuelle Themen (A bis Z)

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, 29006 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 ..
Ähnliche Inhalte
Batch & Shell
Wie ersetze ich in einer .txt ein Lehrzeichen mit einen Zeilenumbruch?
gelöst Frage von AlexIOTBatch & Shell4 Kommentare

Hallo Zusammen, ich hoffe Ihr könnt mir helfen: folgende Ausgangssituation: Inhalt der .txt-Datei: Vorname Nachname, Abteilungskürzel <Mailadresse>; Vorname Nachname, ...

Batch & Shell
Suchen und Ersetzen mehrerer Suchbegriffe per Batch
gelöst Frage von makroll10Batch & Shell4 Kommentare

Hallo, ich habe eine Textdatei mit folgendem Inhalt (Beispiel): "Dies ist ein Text mit 1850101 oder auch mit 1750102 ...

Batch & Shell
Batch: Dateien innerhalb einer Ordnerstruktur nach einem Sting suchen und ersetzen
Frage von yousaintBatch & Shell2 Kommentare

Hallo zusammen, wie oben erwähnt, würde ich gerne innerhalb einer Ordnerstruktur (Dateien innerhalb aller Unterordner) in den Dateien nach ...

Linux Tools
Bash: suchen und ersetzen
Frage von SIPSIPLinux Tools14 Kommentare

Hallo zusammen Möchte aus einer riesigen HTML Datei folgenden Strings ersetzen: ^M\ Nun habe ich dieses kleine Script erstellt, ...

Neue Wissensbeiträge
Humor (lol)

"gimme gimme gimme": Automatischer Test stolpert über Easter Egg im man-Tool

Information von Penny.Cilin vor 1 StundeHumor (lol)2 Kommentare

Interessant, was man so alles als Easter Egg implementiert. Ist schon wieder Ostern? "gimme gimme gimme": Automatischer Test stolpert ...

MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 17 StundenMikroTik RouterOS8 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Sicherheit

Sicherheitslücke in HP-Druckern - Firmware-Updates stehen bereit

Information von BassFishFox vor 17 StundenSicherheit1 Kommentar

Ein weiterer Grund, dass Drucker keinerlei Verbindung nach "auswaerts" haben sollen. Unter Verwendung spezieller Malware können Angreifer aus der ...

Administrator.de Feedback

Entwicklertagebuch: Die Startseite wurde überarbeitet

Information von admtech vor 20 StundenAdministrator.de Feedback10 Kommentare

Hallo Administrator User, mit dem Release 5.7 haben wir unsere Startseite überarbeitet und die Beiträge und Fragen voneinander getrennt. ...

Heiß diskutierte Inhalte
Windows Server
RDP macht Server schneller???
Frage von JaniDJWindows Server17 Kommentare

Hallo Community, wir betrieben seit geraumer Zeit diverse virtuelle Maschinen und Server mit Windows Server 2012. Leider haben wir ...

Windows Netzwerk
Netzwerk Neustrukturierung
Frage von IT-DreamerWindows Netzwerk16 Kommentare

Hallo verehrte Community und Admins, bei uns im Haus steht eine Neustrukturierung an. Dafür benötige ich von euch ein ...

Windows 10
Windows 10 dunkler Bildschirm nach Umfallen
Frage von AkcentWindows 1015 Kommentare

Hallo, habe hier einen Windows 10 Rechner der von einem User umgefallen wurde (Beine übers Knie, an den PC ...

Linux
OpenSource Groupware
Frage von FA-jkaLinux13 Kommentare

Hallo, ich suche eine Groupware als Alternative zum Exchange. Wesentliche Aufgaben sind die Handhabung von E-Mails (persönliche und gemeinsam ...