Ersetzen von Text nur an bestimmer Position
Hallo,
ich nehme mit dem unten angefügten Batch verschiedene Änderungen an einer Datei vor,
Nun möchte ich auch einen bestimmten Textstring (im Besipiel 3333333333) durch einen anderen ersetzen. Diese soll aber nur geschehen, wenn der String an einer bestimmten Poition in der Zeile steht, denn der gleiche String kann später in der Zeile noch einmal vorkommen und soll dort dann aber nicht erstetzt werden. Wie kann ich das umsetzen?
Vielen Dank
ich nehme mit dem unten angefügten Batch verschiedene Änderungen an einer Datei vor,
Nun möchte ich auch einen bestimmten Textstring (im Besipiel 3333333333) durch einen anderen ersetzen. Diese soll aber nur geschehen, wenn der String an einer bestimmten Poition in der Zeile steht, denn der gleiche String kann später in der Zeile noch einmal vorkommen und soll dort dann aber nicht erstetzt werden. Wie kann ich das umsetzen?
Vielen Dank
@echo off & setlocal
set /p File=Geben Sie bitte den Pfad und die Datei an, die umgewandelt werden soll z.B. c:\pfad\input
set /p NewFile=Geben Sie bitte den Pfad und die Datei an, in der die korrigierte Fassung gespeichert werden soll z.B. c:\pfad\output
if exist "%NewFile%" del "%NewFile%"
set "Bak=%File%.bak"
copy "%File%" "%Bak%" >nul
Set "lineout=
set "Blanks100= "
for /f "usebackq delims=" %%i in ("%File%") do set "zeile=%%i%Blanks100%" & call :ProcessLine
Goto :eof
:ProcessLine
Set "zeile=%zeile:&=§%"
Set "zeile=%zeile:ä=ae%"
Set "zeile=%zeile:Ä=AE%"
Set "zeile=%zeile:ü=ue%"
Set "zeile=%zeile:Ü=UE%"
Set "zeile=%zeile:ö=oe%"
Set "zeile=%zeile:Ö=OE%"
Set "zeile=%zeile:ß=ss%"
Set "zeile=%zeile:3333333333=4444444444%"
Set "zeile=%zeile:&=§%"
set "zeile=%zeile:~0,128%
Set "zeile=%zeile:§=^&%"
<nul >>"%NewFile%" set /p dummy=%zeile%
goto :eof
Exit
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 134128
Url: https://administrator.de/contentid/134128
Ausgedruckt am: 17.11.2024 um 00:11 Uhr
8 Kommentare
Neuester Kommentar
Hi,
lad Dir StrFind runter, damit lassen sich Strings in Files suchen und ersetzen.
Gruß,
fritzo
StrFind: [<options>] <search string> [<replace string>] [<file wildcard>]+
Version 1.5 Copyright (c) 2005, Andrew J. Gryc http://gryc.ws andy@gryc.ws
Find/Replace Options
-f : Finds strings only (DEFAULT)
-r : Finds and replaces strings (must include <replace string> argument)
-y : Case sensitive search and replace (DEFAULT)
-i : Case insensitive search and replace
-c : Case insensitive, replacement same case (lower/UPPER/Mixed) as original
-u :*Unicode mode: search and replace are converted from ANSI to Unicode
-n : Match if string is NOT found (cannot be used with -r)
-o :*Ignore escape sequences in input strings
(Example escapes that can be used: ^M \r \015 \x0D)
-w :*Match search string against entire line
Output Options
-t : Print total summary
-g : Print group summaries for each file and wildcard
-m : Print matching lines (if replacing, prints after replacement)
-p : Print matching lines (if replacing, prints original and replacement)
-l : Print line number for matches
-d : Print file and line number for matches
-a : Use all common print options (equivalent to -tgm) (DEFAULT)
General Options
-s :*Recursively process files in subdirectories
-z :*Suppress printing file progress
-k :*Create backups for replaced files
-x :*Fully enumerate and sort file list before searching
(Useful if replace is cyclically replacing in backup files)
-b :*Force binary mode (auto-set if control chars in search/replace)
-e :*Return count of matches as errorlevel to shell
-j[<f>]*: Use index file f (defaults to .strfind.idx in current dir)
-q :*Quick search; assumes index is up-to-date
-v : Verbosity; -v=report times, -vv=index info, -vvv=debugging
-h : Prints this help
Options with * can be turned off by trailing dash (e.g. -k- is no backups)
Default options can be put into STRFIND_OPTIONS environment variable
No search string argument.
lad Dir StrFind runter, damit lassen sich Strings in Files suchen und ersetzen.
Gruß,
fritzo
StrFind: [<options>] <search string> [<replace string>] [<file wildcard>]+
Version 1.5 Copyright (c) 2005, Andrew J. Gryc http://gryc.ws andy@gryc.ws
Find/Replace Options
-f : Finds strings only (DEFAULT)
-r : Finds and replaces strings (must include <replace string> argument)
-y : Case sensitive search and replace (DEFAULT)
-i : Case insensitive search and replace
-c : Case insensitive, replacement same case (lower/UPPER/Mixed) as original
-u :*Unicode mode: search and replace are converted from ANSI to Unicode
-n : Match if string is NOT found (cannot be used with -r)
-o :*Ignore escape sequences in input strings
(Example escapes that can be used: ^M \r \015 \x0D)
-w :*Match search string against entire line
Output Options
-t : Print total summary
-g : Print group summaries for each file and wildcard
-m : Print matching lines (if replacing, prints after replacement)
-p : Print matching lines (if replacing, prints original and replacement)
-l : Print line number for matches
-d : Print file and line number for matches
-a : Use all common print options (equivalent to -tgm) (DEFAULT)
General Options
-s :*Recursively process files in subdirectories
-z :*Suppress printing file progress
-k :*Create backups for replaced files
-x :*Fully enumerate and sort file list before searching
(Useful if replace is cyclically replacing in backup files)
-b :*Force binary mode (auto-set if control chars in search/replace)
-e :*Return count of matches as errorlevel to shell
-j[<f>]*: Use index file f (defaults to .strfind.idx in current dir)
-q :*Quick search; assumes index is up-to-date
-v : Verbosity; -v=report times, -vv=index info, -vvv=debugging
-h : Prints this help
Options with * can be turned off by trailing dash (e.g. -k- is no backups)
Default options can be put into STRFIND_OPTIONS environment variable
No search string argument.
Hallo josken96!
Abgesehen davon, dass Deine "bestimmte" Position für mich eine "unbestimmte" ist, wäre es auch hilfreich, mehr über die Zeile zu wissen - insbes, ob sie bedenkenlos zB an Position 40 geteilt werden kann, um den zu ersetzenden String im einen Teil und den zu schützenden String im anderen Teil zu haben (was ohne großen Aufwand nur geht, wenn ich sicher sein kann, dass die Gesamtlänge der Zeile größer ist als der Wert der Teilungsposition) ...
Wenn ich letzteres einmal unterstelle und die Position zu Testzwecken mit 15 bestimme, sollten folgende (ungetestete) Zeilen als Ersatz der bisherigen Zeile 22 genügen:
[Edit] Soferne die Postion und Länge des zu ersetzenden Teiles immer identisch ist, wäre
natürlich noch genauer ...
[Edit]
Grüße
bastla
Abgesehen davon, dass Deine "bestimmte" Position für mich eine "unbestimmte" ist, wäre es auch hilfreich, mehr über die Zeile zu wissen - insbes, ob sie bedenkenlos zB an Position 40 geteilt werden kann, um den zu ersetzenden String im einen Teil und den zu schützenden String im anderen Teil zu haben (was ohne großen Aufwand nur geht, wenn ich sicher sein kann, dass die Gesamtlänge der Zeile größer ist als der Wert der Teilungsposition) ...
Wenn ich letzteres einmal unterstelle und die Position zu Testzwecken mit 15 bestimme, sollten folgende (ungetestete) Zeilen als Ersatz der bisherigen Zeile 22 genügen:
set "Teil1=%zeile:~,40%"
set "Teil2=%zeile:~40%"
set "zeile=%Teil1:3333333333=4444444444%%Teil2%"
set "Teil1=%zeile:~,14%"
set "Teil2=%zeile:~14,10%
set "Teil3=%zeile:~24%"
set "zeile=%Teil1%%Teil2:3333333333=4444444444%%Teil3%"
[Edit]
Grüße
bastla
@fritzo
Das sind aber viele Optionen - welche ist denn erforderlich, um nur in einem bestimmten Teil des Strings zu ersetzen?
Grüße
bastla
Das sind aber viele Optionen - welche ist denn erforderlich, um nur in einem bestimmten Teil des Strings zu ersetzen?
Grüße
bastla
Zitat von @bastla:
@fritzo
Das sind aber viele Optionen - welche ist denn erforderlich, um nur in einem bestimmten Teil des Strings zu ersetzen?
@fritzo
Das sind aber viele Optionen - welche ist denn erforderlich, um nur in einem bestimmten Teil des Strings zu ersetzen?
@bastla
Wer wie josken in einem Batch mit FOR-Schleifen Text einliest, parst und dann an Subroutinen weitergibt, von dem erwarte ich auch, daß er sich kurz mal die englische Hilfe eines Doskommandos ansehen und diesem entnehmen kann, welche Syntax er verwenden muß.. ansonsten könnte ich auch vor jedes Kommando schreiben "Dies bitte in der Dosbox ausführen" :P
@fritzo
Falls ich Dich richtig verstehe, heißt das:
Grüße
bastla
Falls ich Dich richtig verstehe, heißt das:
- "StrFind" bietet die gewünschte Funktionalität
- aus edukativen Gründen hast Du aber eine Menge dafür nicht relevanter Optionen gepostet
Grüße
bastla
@bastla
Korrekt. Wobei ich finde, daß Deine Lösung besser ist, daß "set" auch Strings suchen und ersetzen kann, wußte ich nicht. Meine Lösung würde erfordern, daß man das Textfile nochmal anfasst bzw. mit Zwischenkopien und type | find arbeitet, da StrFind nicht in der Lage ist, nach der ersten Fundstelle des Strings abzubrechen. Ich würde zu einer Umsetzung mit vbscript tendieren, hier könnte man mit einer simplen Schleife den Text einlesen und nach dem ersten Fund aus der Schleife rausspringen.
Korrekt. Wobei ich finde, daß Deine Lösung besser ist, daß "set" auch Strings suchen und ersetzen kann, wußte ich nicht. Meine Lösung würde erfordern, daß man das Textfile nochmal anfasst bzw. mit Zwischenkopien und type | find arbeitet, da StrFind nicht in der Lage ist, nach der ersten Fundstelle des Strings abzubrechen. Ich würde zu einer Umsetzung mit vbscript tendieren, hier könnte man mit einer simplen Schleife den Text einlesen und nach dem ersten Fund aus der Schleife rausspringen.
@fritzo
Da josken69 bisher offensichtlich mit Batch zurechtgekommen ist, habe ich davon abgesehen, VBScript anzubieten; allerdings stimme ich Dir zu, dass für "Suchen/Ersetzen" VBScript die bessere Sparache ist - nicht zuletzt, weil die Sonderzeichen-Problematik entfällt und auch RegEx samt Submatches zur Verfügung stehen ...
Grüße
bastla
Da josken69 bisher offensichtlich mit Batch zurechtgekommen ist, habe ich davon abgesehen, VBScript anzubieten; allerdings stimme ich Dir zu, dass für "Suchen/Ersetzen" VBScript die bessere Sparache ist - nicht zuletzt, weil die Sonderzeichen-Problematik entfällt und auch RegEx samt Submatches zur Verfügung stehen ...
Grüße
bastla