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

Ersetzen von Text nur an bestimmer Position

Frage Entwicklung Batch & Shell

Mitglied: josken69

josken69 (Level 1) - Jetzt verbinden

22.01.2010 um 13:18 Uhr, 6436 Aufrufe, 8 Kommentare

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

01.
  
02.
@echo off & setlocal 
03.
set /p File=Geben Sie bitte den Pfad und die Datei an, die umgewandelt werden soll z.B. c:\pfad\input   
04.
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   
05.
if exist "%NewFile%" del "%NewFile%" 
06.
set "Bak=%File%.bak" 
07.
copy "%File%" "%Bak%" >nul 
08.
Set "lineout= 
09.
set "Blanks100=                                                                                                    " 
10.
for /f "usebackq delims=" %%i in ("%File%") do set "zeile=%%i%Blanks100%" & call :ProcessLine 
11.
Goto :eof 
12.
 
13.
:ProcessLine 
14.
Set "zeile=%zeile:&=§%" 
15.
Set "zeile=%zeile:ä=ae%" 
16.
Set "zeile=%zeile:Ä=AE%" 
17.
Set "zeile=%zeile:ü=ue%" 
18.
Set "zeile=%zeile:Ü=UE%" 
19.
Set "zeile=%zeile:ö=oe%" 
20.
Set "zeile=%zeile:Ö=OE%" 
21.
Set "zeile=%zeile:ß=ss%" 
22.
Set "zeile=%zeile:3333333333=4444444444%" 
23.
Set "zeile=%zeile:&=§%" 
24.
set "zeile=%zeile:~0,128% 
25.
Set "zeile=%zeile:§=^&%" 
26.
<nul >>"%NewFile%" set /p dummy=%zeile% 
27.
 
28.
goto :eof 
29.
Exit 
30.
 
Mitglied: fritzo
22.01.2010 um 15:04 Uhr
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.
Bitte warten ..
Mitglied: bastla
22.01.2010 um 15:04 Uhr
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:
01.
set "Teil1=%zeile:~,40%" 
02.
set "Teil2=%zeile:~40%" 
03.
set "zeile=%Teil1:3333333333=4444444444%%Teil2%"
[Edit] Soferne die Postion und Länge des zu ersetzenden Teiles immer identisch ist, wäre
01.
set "Teil1=%zeile:~,14%" 
02.
set "Teil2=%zeile:~14,10% 
03.
set "Teil3=%zeile:~24%" 
04.
set "zeile=%Teil1%%Teil2:3333333333=4444444444%%Teil3%"
natürlich noch genauer ...
[Edit]

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

Grüße
bastla
Bitte warten ..
Mitglied: fritzo
23.01.2010 um 14:02 Uhr
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
Bitte warten ..
Mitglied: bastla
23.01.2010 um 14:32 Uhr
@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
Bitte warten ..
Mitglied: fritzo
23.01.2010 um 15:14 Uhr
@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.
Bitte warten ..
Mitglied: bastla
23.01.2010 um 15:30 Uhr
@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
Bitte warten ..
Mitglied: josken69
25.01.2010 um 11:45 Uhr
Hallo,
danke bastla, das letzte Posting war genau das, was ich gesucht habe. Schöne Woche noch.
Gruß josken69
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
gelöst Suchen ersetzen mit Sonderzeichen (2)

Frage von GNLen1 zum Thema Batch & Shell ...

Windows 10
gelöst Werden Dateien beim Ersetzen wirklich überschrieben? (3)

Frage von Nexder zum Thema Windows 10 ...

Microsoft Office
Via SCCM Office 2013 32bit ersetzen durch Office 2016 64bit (9)

Frage von KarstenF zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Exchange Server
gelöst Email in Exchange an 2ten Empfänger senden (18)

Frage von MultiStorm zum Thema Exchange Server ...

Weiterbildung
Gehaltsvorstellungen (17)

Frage von SYS64738 zum Thema Weiterbildung ...

Verschlüsselung & Zertifikate
gelöst Festplattenverschlüsselung im Ausland (13)

Frage von Nicolaas zum Thema Verschlüsselung & Zertifikate ...

Windows Server
gelöst Microsoft-Lizenz CALs und passendes Server-Betriebssystem (13)

Frage von planetIT2016 zum Thema Windows Server ...