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, 6432 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 ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
Powershell - In Textdatei suchen und ersetzen (1)

Frage von Raaja89 zum Thema Batch & Shell ...

Windows Netzwerk
Windows Server 2003 SBS Netzwerk durch neuen Server Ersetzen (9)

Frage von MultiStorm zum Thema Windows Netzwerk ...

Microsoft Office
gelöst Wie kann man die Standard-Schriftart bei einfügen von Text in Word 2013 festlegen? (3)

Frage von Rene1976 zum Thema Microsoft Office ...

Batch & Shell
gelöst Suchen und Ersetzen mehrerer Suchbegriffe per Batch (4)

Frage von makroll10 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (14)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...