josken69
Goto Top

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

 
@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

Content-Key: 134128

Url: https://administrator.de/contentid/134128

Ausgedruckt am: 28.03.2024 um 23:03 Uhr

Mitglied: fritzo
fritzo 22.01.2010 um 15:04:30 Uhr
Goto Top
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.
Mitglied: bastla
bastla 22.01.2010 um 15:04:41 Uhr
Goto Top
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:
set "Teil1=%zeile:~,40%"  
set "Teil2=%zeile:~40%"  
set "zeile=%Teil1:3333333333=4444444444%%Teil2%"  
[Edit] Soferne die Postion und Länge des zu ersetzenden Teiles immer identisch ist, wäre
set "Teil1=%zeile:~,14%"  
set "Teil2=%zeile:~14,10%  
set "Teil3=%zeile:~24%"  
set "zeile=%Teil1%%Teil2:3333333333=4444444444%%Teil3%"  
natürlich noch genauer ...
[Edit]

Grüße
bastla
Mitglied: bastla
bastla 22.01.2010 um 15:09:36 Uhr
Goto Top
@fritzo
Das sind aber viele Optionen - welche ist denn erforderlich, um nur in einem bestimmten Teil des Strings zu ersetzen?

Grüße
bastla
Mitglied: fritzo
fritzo 23.01.2010 um 14:02:15 Uhr
Goto Top
Zitat von @bastla:
@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
Mitglied: bastla
bastla 23.01.2010 um 14:32:11 Uhr
Goto Top
@fritzo
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
Mitglied: fritzo
fritzo 23.01.2010 um 15:14:55 Uhr
Goto Top
@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.
Mitglied: bastla
bastla 23.01.2010 um 15:30:21 Uhr
Goto Top
@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
Mitglied: josken69
josken69 25.01.2010 um 11:45:41 Uhr
Goto Top
Hallo,
danke bastla, das letzte Posting war genau das, was ich gesucht habe. Schöne Woche noch.
Gruß josken69