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

Batch um alle gleichen zeichenfolgen in textdatei zu ändern

Frage Entwicklung Batch & Shell

Mitglied: bernimoses

bernimoses (Level 1) - Jetzt verbinden

18.05.2008, aktualisiert 18.10.2012, 6415 Aufrufe, 15 Kommentare

hi,

ich hab folgendes Problem, ich will (wie die überschrift schon sagt) alle identischen zeichen folgen in einer Textdatei ändern.

z.B.:
Alte Textdatei:
root = 55555
doc = 55555test\
...
Neue Textdatei:
root = C:\Programme\
doc = C:\Programme\test\
...
hier hab ich wie man sieht einfach "55555" mit "C:\Programme\ ersetzt. ( nur leider bekomm ich das nicht mit einer bat hin!!!)
Der Sinn der Sache ist das Aktuelle Verzeichniss anstatt des "C:\" reinzuschreiben.

Hab auch schon das probiert:
@echo off
setlocal enabledelayedexpansion

set "filename=test.txt"
set "tempfile=temp.txt"
set "path=%cd%\"

for /F "delims=" %%a in (%filename%) do (
set text=%%a
set text=!text:55555=%path%!>>%tempfile%
)

del %filename%
ren %tempfile% test.conf
Pause
Des Teil hat mir aber dann die kompltte Datei gelehrt!!

Ich hofe doch das die Genies unter euch mir helfen können *g*

Mit freundlichen Grüßen bernimoses
Mitglied: bastla
18.05.2008, aktualisiert 18.10.2012
Hallo bernimoses!

Derlei lässt sich zwar auch mit Batch alleine bewerksteligen (zumindest solange es relativ "einfacher" Text ohne allzuviele Sonderzeichen ist), aber leichter / sicherer geht es mit einem in den Batch integrierten VBScript - für ein Beispiel (dort gleich für alle Textdateien eines Ordners) siehe: http://www.administrator.de/forum/batch-zum-%c3%84ndern-teile-einer-txt ...

Trotzdem Dein (ursprüngliches) Beispiel als native Batch:
01.
@echo off & setlocal 
02.
if exist D:\Neue.txt del D:\Neue.txt 
03.
for /f "delims=" %%i in (D:\Alte.txt) do set "Zeile=%%i" & call :ProcessLine 
04.
goto :eof 
05.
 
06.
:ProcessLine 
07.
>>D:\Neue.txt echo %Zeile:ich=du%
Anmerkung: Leerzeilen werden in dieser einfachen Fassung nicht in die Datei "Neue.txt" übernommen.

Grüße
bastla

[Edit] Löschen der ev bereits vorhandenen Zieldatei ergänzt [/Edit]
Bitte warten ..
Mitglied: bastla
18.05.2008 um 22:46 Uhr
... zu Deinem nachgereichten Batch:

Abgesehen davon, dass %path% (da mit dieser - bereits vorhandenen - Systemvariable der Suchpfad auch für externe CMD-Befehle, wie etwa "xcopy", angegeben wird) kein wirklich guter Variablenname für Deinen Zweck ist (wenngleich sich in diesem kurzen Beispiel daraus noch kein Problem ergibt), wäre das letzte "set" durch ein "echo" zu ersetzen.

Außerdem sehe ich keinen Grund für die Verwendung des "tempfiles" - Du könntest gleich in "test.conf" schreiben ...

Noch eine Anmerkung: "delayedexpansion" funktioniert nur zuverlässig, wenn sich in Deiner Textdatei kein "!" befindet.

Grüße
bastla
Bitte warten ..
Mitglied: bernimoses
18.05.2008 um 22:50 Uhr
Also dann anstatt: do set "Zeile=%%i" & call :ProcessLine >> do echo "Zeile=%%i" & call :ProcessLine

oda was?
Danke auf jeden falls *freu*
Bitte warten ..
Mitglied: bastla
18.05.2008 um 22:55 Uhr
... ich hatte das letzte "set" (und die Variable dahinter) in Deinem Batch gemeint, daher:
01.
@echo off 
02.
setlocal enabledelayedexpansion 
03.
 
04.
set "filename=test.txt" 
05.
set "tempfile=temp.txt" 
06.
set "p=%cd%\" 
07.
 
08.
for /F "delims=" %%a in (%filename%) do ( 
09.
    set text=%%a 
10.
    echo !text:55555=%p%!>>%tempfile% 
11.
12.
 
13.
del %filename% 
14.
ren %tempfile% test.conf
Übrigens: Wenn schon mit %tempfile%, dann zumindest anstelle des "ren" ein "move", damit eine ev schon vorhandene "test.conf" überschrieben wird (und vielleicht doch auch noch, zur Sicherheit, %tempfile% vorweg löschen) ...

Grüße
bastla
Bitte warten ..
Mitglied: bernimoses
18.05.2008 um 23:07 Uhr
Du hast doch vorher gesagt das in dem textfile dann keine "!" sein dürfen. aber blöderweise sind die in meine textfile auch noch mit drin. Da ich sie nicht rauslöschen kann (weill eich dann die config zerstöre) kannst du mir bitte noch mal ein bsp. geben das jetzt genau in meine fall funktioniert?

Danke schonmal.
Bitte warten ..
Mitglied: bastla
18.05.2008 um 23:19 Uhr
Hallo bernimoses!

Das gewünschte Beispiel steht schon (allerdings als Link) in meinem ersten Kommentar - soll heißen, dass Du mit der VBScript-Variante ein derartiges Problem nicht hättest ...

Konkrete Umsetzung für Deinen Fall:
01.
@echo off & setlocal 
02.
set "Quelle=test.txt" 
03.
set "Ziel=test.conf" 
04.
set "Von=55555" 
05.
set "Nach=%cd%\" 
06.
 
07.
set R=%temp%\Repl.vbs 
08.
echo Set fso=CreateObject("Scripting.FileSystemObject"):F=WScript.Arguments(0):T=fso.OpenTextFile(F).ReadAll:fso.OpenTextFile(F,2,True).Write Replace(T,"%Von%","%Nach%")>%R% 
09.
 
10.
for %%i in ("%Quelle%") do cscript //nologo %R% "%%~i" 
11.
move "%Quelle%" "%Ziel%"
Ersetzt wird hier immer gleich in der angegebenen %Quelle% - da Du diese ohnehin löschen willst, könntest Du sie eigentlich auch gleich im Vorhinein auf den gewünschten Namen umbenennen - im Beispiel oben erfolgt dies (per "move") erst nach den Ersetzungen ...

Grüße
bastla

[Edit] Parameter-Schreibweise in "for"-Zeile auf "%%~i" geändert [/Edit]
Bitte warten ..
Mitglied: bernimoses
18.05.2008 um 23:30 Uhr
hm, irgendwie geht das bei mir nicht der sagt Windows script fehler: Zugriff auf windows script host wurde deaktiviert.

Was kann ich machen?
Bitte warten ..
Mitglied: bastla
19.05.2008 um 00:12 Uhr
Hallo bernimoses!

Was kann ich machen?
Wenn wir das Aktivieren des WSH einmal ausschließen wollen, fällt mir eigentlich nur etwas in der Art ein:
01.
@echo off & setlocal 
02.
 
03.
set "filename=test.txt" 
04.
set "newfile=test.conf" 
05.
 
06.
set "p=%cd%\" 
07.
set "o=55555" 
08.
 
09.
if exist "%newfile%" del "%newfile%" 
10.
 
11.
for /F "usebackq delims=" %%a in ("%filename%") do set "Zeile=%%a" & call :ProcessLine 
12.
 
13.
:: del "%filename%" 
14.
goto :eof 
15.
 
16.
:ProcessLine 
17.
set "Zeile=%Zeile:!=§%" 
18.
setlocal enabledelayedexpansion 
19.
set "Zeile=!Zeile:%o%=%p%! 
20.
setlocal disabledelayedexpansion 
21.
>>%newfile% echo %Zeile:§=!%
Hier wird zunächst jedes "!" durch ein "§" (bzw, wenn Du keinen ASCII-Editor verwendest, durch "°") ersetzt. Danach wird, unter Verwendung der ("dazugeschalteten") "delayedexpansion" die Ersetzung mit den Variablen %o% und %p% vorgenommen und abschließend (jetzt wieder ohne "delayedexpansion") werden die "!" wieder hergestellt und die Zeile gleich in die Zieldatei geschrieben.

Das Löschen der Ausgangsdatei habe ich, zumindest für die Testphase, durch "::" auskommentiert.

Grüße
bastla

[Edit] Auf Variante ohne Temporärdateien abgeändert [/Edit]
Bitte warten ..
Mitglied: bernimoses
19.05.2008 um 14:11 Uhr
Ich bekomms nicht hin,
Jetzt löscht er zwar nicht mehr die komplette datei, schreib aber in die neue datei nur die ersten 4 zeilen der alten.
Am besten ich geb dir mal die datei. Bei der sind halt nicht die "5" zu ersetzten sondern die "X".

http://uploaded.to/?id=xptg3d

So hoffe das du mir helfen kannst.

EDIT: Ich glaub ich weis an was das liegt: In der Datei sind lauter Sonderzeichen und bei dem ersten "<" bricht er dann einfach ab. muss man die dann auch erst in ein anders zeichen umwandeln? Denk schon! Würdest du das hinbekommen? Danke
Bitte warten ..
Mitglied: bastla
19.05.2008 um 15:14 Uhr
Hallo bernimoses!

Es wird Zeit für etwas Vernünftiges ...

Wenn es kein VBScript sein darf, lade Dir zB von hier eine Windows-Version von "sed" herunter, lege die "sed.exe" in einen beliebigen Ordner (in meinem Beispiel unten wäre das "C:\Scripts") und verwende folgende Zeile:
01.
type httpd.conf|C:\Scripts\sed s/xxxxxxxxxx/%cd%/g>test.conf
Grüße
bastla
Bitte warten ..
Mitglied: bernimoses
19.05.2008 um 15:24 Uhr
hm, kann es sein dass ich sau doof bin wenn ich des in ne bat zu dan löshct er wieder alles xD
und aus der hilfe zu dem prog werd ich auch ned schlau kannste bitte nur ganz kurz die batch reinschreiben. Schonmal super spitzen mäsigen Dank an dich...

g berni
Bitte warten ..
Mitglied: bastla
19.05.2008 um 16:12 Uhr
Hallo bernimoses!

Du brauchst nur diese eine Zeile ...

Grüße
bastla
Bitte warten ..
Mitglied: bernimoses
19.05.2008 um 16:23 Uhr
hm, geht aber eben ned.

Hab die sed.exe in C:\Scripts\ getan und in die batchdas rein:

@echo off
type httpd.conf|C:\Scripts\sed s/xxxxxxxxxx/%cd%/g>test.conf


Aber das geht ned...
Er sagt immer "s inkorrekt option" *ratlos*
Bitte warten ..
Mitglied: bastla
19.05.2008 um 16:49 Uhr
Hallo bernimoses!

Versuch es mal so:
01.
type httpd.conf|C:\Scripts\sed s/xxxxxxxxxx/"%cd:\=\\%"/g>test.conf
Grüße
bastla
Bitte warten ..
Mitglied: bernimoses
19.05.2008 um 17:36 Uhr
Supa Danke funktioniert perfekt Danke Danke Danke... auch für die tolle Hilfe

Greets berni
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

Batch & Shell
gelöst Per Batch FTP-Server Dateien ändern (1)

Frage von Marlon1 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch: Öffnen einer Textdatei nach Systemneustart (17)

Frage von sascha382 zum Thema Batch & Shell ...

Batch & Shell
gelöst VBS Script in eine Textdatei ausgeben (VBS mit Batch zusammenführen) (5)

Frage von Luuke257 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...