Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit Batch ein bestimmtes zeichen oder Wort in einer Textdatei löschen
Wie kann man eine Textdatei nach einem bestimmten Zeichen, oder Wort suchen lassen, und diesen aus dieser Datei entfernen?
MfG Da_B00N
Wie kann man eine Textdatei nach einem bestimmten Zeichen, oder Wort suchen lassen, und diesen aus dieser Datei entfernen?
MfG Da_B00N
google => http://www.linuxforen.de/forums/showthread.php?t=164901
Gruß
noviz :cool:
google => http://www.linuxforen.de/forums/showthread.php?t=164901
Gruß
noviz :cool:
Danke, habe aber Windows
Gibt es sowas ähnliches auch für Windows?
mnemonic
18.11.2006, 17:37
Spontan fällt mir dazu nur ein, dass Du cygwin (http://cygwin.com/) benutzen könntest.
Danke, habe aber Windows
Gibt es sowas ähnliches auch für Windows?
Windows hat keine Bordmittel, um es per Script zu machen. Wenn's aber nur eine Datei ist, dann kannst du natürlich das Ersetzen von Wordpad verwenden. Das hat dann zwar nichts mehr mir Scripts zu tun, ist aber mit Bordmitteln zu bewältigen.
Windows hat keine Bordmittel, um es per Script zu machen. Wenn's aber nur eine Datei ist, dann kannst du natürlich das Ersetzen von Wordpad verwenden. Das hat dann zwar nichts mehr mir Scripts zu tun, ist aber mit Bordmitteln zu bewältigen.
Mhm, da muss es doch bestimmt was geben, z.b die datei in einzelne buchstaben aufzuteilen und dann wieder alles zusammenzusetzen, nur ohne diesem einem Zeichen. Vll mit dem find und for Befehl...
Naja, wenn jemand eine Idee hat, soll er sie bitte posten...
@mnemonic: Cygwin habe ich auch, aber ich suche iene Windowslösung
Trotzdem Danke
Firefall
26.11.2006, 15:58
Windows hat keine Bordmittel, um es per Script zu machen.
Gewiss. Mit Batch geht's nicht, aber mit VBScript.
strAppName = "RegExp Replace"
Set objFSO = CreateObject("Scripting.FileSystemObject")
For Each strArgument In WScript.Arguments
Set objFile = objFSO.GetFile(strArgument)
intFileSize = objFile.Size
Set objFile = objFile.OpenAsTextStream()
strFileContent = objFile.Read(intFileSize)
objFile.Close
Set objRegExp = New RegExp
objRegExp.Pattern = InputBox("Enter search pattern for file " & strArgument & ":", strAppName)
objRegExp.Global = True
objRegExp.IgnoreCase = True
strFileContent = objRegExp.Replace(strFileContent,Eval(InputBox("Enter replace pattern for file " & strArgument & ":", strAppName, Chr(34) & Chr(34))))
Set objFile = objFSO.OpenTextFile(strArgument, 2)
objFile.Write strFileContent
objFile.Close
MsgBox "Replacements applied for file: " & strArgument & "!", vbOKOnly, strAppName
Next
In eine beliebige .VBS Datei zu kopieren. Dann per Drag'n'Drop (Beliebig viele Dateien) drauf legen, für jede einzelne wird ein RegExp Pattern (Einfach das Wort, wenn's nur das sein soll) gefragt, dann ein Replace-Pattern (Einfach leer lassen zum löschen). Viel Spass.
strAppName = "RegExp Replace"
Set objFSO = CreateObject("Scripting.FileSystemObject")
For Each strArgument In WScript.Arguments
Set objFile = objFSO.GetFile(strArgument)
intFileSize = objFile.Size
Set objFile = objFile.OpenAsTextStream()
strFileContent = objFile.Read(intFileSize)
objFile.Close
Set objRegExp = New RegExp
objRegExp.Pattern = InputBox("Enter search pattern for file " & strArgument & ":", strAppName)
objRegExp.Global = True
objRegExp.IgnoreCase = True
strFileContent = objRegExp.Replace(strFileContent,Eval(InputBox("Enter replace pattern for file " & strArgument & ":", strAppName, Chr(34) & Chr(34))))
Set objFile = objFSO.OpenTextFile(strArgument, 2)
objFile.Write strFileContent
objFile.Close
MsgBox "Replacements applied for file: " & strArgument & "!", vbOKOnly, strAppName
Next In eine beliebige .VBS Datei zu kopieren. Dann per Drag'n'Drop (Beliebig viele Dateien) drauf legen, für jede einzelne wird ein RegExp Pattern (Einfach das Wort, wenn's nur das sein soll) gefragt, dann ein Replace-Pattern (Einfach leer lassen zum löschen). Viel Spass.
Danke, werde es gleich probieren, nur schade, dass man das nicht automatisieren kann...
Oder lässt sich das Drag&Drop auch automatisieren, wenn der Dateiname und das zu ersetzende zeichen/Wort imemr gleich bleiben?
Dateiname: auto.bat
Zu ersetzen:
Das Zeichen: "
und das Wort: Time
Firefall
02.12.2006, 19:01
Klar :D Sage nochmal was du genau willst, hab's nicht begriffen wie's sein soll.
Klar :D Sage nochmal was du genau willst, hab's nicht begriffen wie's sein soll.
Akso, die Datei auto.bat soll durchsucht werden, nach dem Zeuchen: "
und nach dem Wort: Time
Dann sollen dieses Zeichen und das Wort im ganzen text gelöscht werden und das Ergebniss (also ohne das zeichen und das Wort) wieder als auto.bat gespeichert werden
MfG Da_B00N
Firefall
04.12.2006, 16:30
strFilename = "auto.bat"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile(strFilename)
intFileSize = objFile.Size
Set objFile = objFile.OpenAsTextStream()
strFileContent = objFile.Read(intFileSize)
objFile.Close
Set objRegExp = New RegExp
objRegExp.Pattern = Chr(34)
objRegExp.Global = True
objRegExp.IgnoreCase = True 'False für case-sensitive
strFileContent = objRegExp.Replace(strFileContent, "")
objRegExp.Pattern = "Time"
strFileContent = objRegExp.Replace(strFileContent, "")
Set objFile = objFSO.OpenTextFile(strFilename, 2)
objFile.Write strFileContent
objFile.Close
Voilà ;) Abspeichern als Datei mit der Endung .vbs. auto.bat muss im selben Ordner sein (Sonst Pfad anpassen).
Danke :)
Du hast mir echt einen Haufen Arbeit abgeschafft ^^
An alle:
VIELEN DANK FÜR DIE HILFE!
hallo
Ich bin durch Google auf dein script gestossen und es ist eigentlich genau, wonach ich suchte. Leider kenn ich mich mit vbs nicht aus und möchte gerne 2 kleine Änderungen vornehmen:
1: ich suche und ersetzte mit einem datum, zB 18.09.2007 was mir aber einen syntaxerror erzeugt.
2: ich benötige es mit mehreren dateien die ich aufs mal ändern möchte, jedoch für alle dateien die seleben such und ersetzen parameter benutze und deshalb nur einmal gefragt werden möchte nach den kriterien pro verarbeitung.
Wäre super wenn du mir da noch ein klein wenig weiterhelfen könntest ;)
mfg
pasci
Gewiss. Mit Batch geht's nicht, aber mit VBScript.
strAppName = "RegExp Replace"
Set objFSO = CreateObject("Scripting.FileSystemObject")
For Each strArgument In WScript.Arguments
Set objFile = objFSO.GetFile(strArgument)
intFileSize = objFile.Size
Set objFile = objFile.OpenAsTextStream()
strFileContent = objFile.Read(intFileSize)
objFile.Close
Set objRegExp = New RegExp
objRegExp.Pattern = InputBox("Enter search pattern for file " & strArgument & ":", strAppName)
objRegExp.Global = True
objRegExp.IgnoreCase = True
strFileContent = objRegExp.Replace(strFileContent,Eval(InputBox("Enter replace pattern for file " & strArgument & ":", strAppName, Chr(34) & Chr(34))))
Set objFile = objFSO.OpenTextFile(strArgument, 2)
objFile.Write strFileContent
objFile.Close
MsgBox "Replacements applied for file: " & strArgument & "!", vbOKOnly, strAppName
Next
In eine beliebige .VBS Datei zu kopieren. Dann per Drag'n'Drop (Beliebig viele Dateien) drauf legen, für jede einzelne wird ein RegExp Pattern (Einfach das Wort, wenn's nur das sein soll) gefragt, dann ein Replace-Pattern (Einfach leer lassen zum löschen). Viel Spass.
Firefall
02.10.2007, 11:52
Sowas dürfte gehen:
strAppName = "RegExp Replace"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objRegExp = New RegExp
objRegExp.Global = True
objRegExp.IgnoreCase = True
objRegExp.Pattern = InputBox("Enter search pattern for files:", strAppName)
strReplacePattern = Eval(InputBox("Enter replace pattern for file " & strArgument & ":", strAppName, Chr(34) & Chr(34)))
For Each strArgument In WScript.Arguments
Set objFile = objFSO.GetFile(strArgument)
intFileSize = objFile.Size
Set objFile = objFile.OpenAsTextStream()
strFileContent = objFile.Read(intFileSize)
objFile.Close
strFileContent = objRegExp.Replace(strFileContent, strReplacePattern)
Set objFile = objFSO.OpenTextFile(strArgument, 2)
objFile.Write strFileContent
objFile.Close
Next
MsgBox "Replacements applied to all files!", vbOKOnly, strAppNameBitte daran denken, dass das Replace-Pattern mit Eval() abgearbeitet wird; das bedeutet für den User, dass Strings mit " eingegrenzt werden müssen. Falls du noch eine RegExp brauchst für dein Problem, dann frag bitte im RegExp-Forum ;)
thunderbird
24.10.2007, 22:51
Hallo Firefall,
bin auch durch Google auf diesen Beitrag gestossen. Wie müsste Dein Script erweitert werden, um:
- beim ersten Auftreffen des Strings, diesen zu überspringen und nur alle nachfolgenden identischen Strings ersetzen;
und
- weitere Strings, die sich vom ersten inhaltlich unterscheiden, im gleichen Durchlauf ebenfalls ersetzen.
Habe das Script noch nicht testen können, jedoch noch eine weitere Frage:
Funktioniert das Script auch bei Textpassagen, die über mehrere Zeilen, also auch mit Zeilenschalter vorliegen?
Schon mal vielen Dank und
mfG
Thunderbird
Firefall
24.10.2007, 23:34
Habe das Script noch nicht testen können, jedoch noch eine weitere Frage:
Funktioniert das Script auch bei Textpassagen, die über mehrere Zeilen, also auch mit Zeilenschalter vorliegen?Ja, das ist möglich. Man kann nach Wünschen ASCII-Zahlen angeben oder auch Platzhalter (von VBS) für Zeilenumbrüche (Oder z.B. das aktuelle Datum, etc). Den Rest schau ich morgen *gähn*
Firefall
25.10.2007, 18:15
Hallo Firefall,
bin auch durch Google auf diesen Beitrag gestossen. Wie müsste Dein Script erweitert werden, um:
- beim ersten Auftreffen des Strings, diesen zu überspringen und nur alle nachfolgenden identischen Strings ersetzen;Sowas:
strAppName = "RegExp Replace"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objRegExp = New RegExp
objRegExp.Global = True
objRegExp.IgnoreCase = True
objRegExp.Pattern = InputBox("Enter search pattern for files:", strAppName)
strReplacePattern = Eval(InputBox("Enter replace pattern for file " & strArgument & ":", strAppName, Chr(34) & Chr(34)))
For Each strArgument In WScript.Arguments
Set objFile = objFSO.GetFile(strArgument)
intFileSize = objFile.Size
Set objFile = objFile.OpenAsTextStream()
strFileContent = objFile.Read(intFileSize)
objFile.Close
Set colMatches = objRegExp.Execute(strFileContent)
strFileContent = objRegExp.Replace(Right(strFileContent, Len(strFileContent) - colMatches.Item(1).FirstIndex + Len(colMatches.Item(1).Value) - 1, strReplacePattern)
Set objFile = objFSO.OpenTextFile(strArgument, 2)
objFile.Write strFileContent
objFile.Close
Next
MsgBox "Replacements applied to all files!", vbOKOnly, strAppName
Bin mir gerade nicht mehr sicher, wie man die Matches anspricht. Probiers einfach mal.
- weitere Strings, die sich vom ersten inhaltlich unterscheiden, im gleichen Durchlauf ebenfalls ersetzen.Das ist ein RegExp-"Problem". Du kannst eine Oder-Bedingung einbauen. z.B. so:
"String.{10}1|String.{5}2"Würde alle Textpassagen ersetzen, die "String", 10 beliebige Zeichen und 1 aufweisen ODER (mit | gemacht) die "String", 50 beliebige Zeichen und 2 aufweisen. ACHTUNG! Das Replace-Pattern bleibt dasselbe. Wenn du das auch noch anders willst, dann musst du mehrere Durchläufe machen.
Was gebt ihr eigentich auf Google so ein um das zu finden? :D
thunderbird
03.11.2007, 17:03
Hallo Firefall,
leider konnte ich in den letzten Tagen das Coding-Board nicht erreichen.
Habe zwischenzeitlich auf der Basis Deiner Vorgaben http://www.coding-board.de/board/images/icons/icon14.gif das Script mit Unterstützung eines anderen Boards so erstellen können, wie ich es benötige.
Trotzdem allerbesten Dank für Deine tollen Unterstützung.:)
Den nun fertigen Code füge ich bei:
' *** Konstanten ***
strFilename = "neoex.txt" ' Name der Textdatei
strDatabaseZeile = "Database: C:\\Programme\\PGS\\Pgs.gdb, User: PGS" & vbCrLf
strHeaderzeile1 = "KNR PNR AM LM GDAT " & vbCrLf
strHeaderzeile2 = "====== ========== ====================== ====================== ======== " & vbCrLf
strHeaderzeile3 = "KNR PNR AM LM GDAT "
' *** Textdatei lesen ***
Set objFSO = CreateObject("Scripting.FileSystemObject") ' Objekt für Zugriff auf Dateisystem erstellen
Set objFile = objFSO.GetFile(strFilename) ' Dateiinformtionen holen und ...
intFileSize = objFile.Size ' ... Größe der Textdatei festhalten
Set objFile = objFile.OpenAsTextStream() ' Textdatei als Textstrom öffnen
strFileContent = objFile.Read(intFileSize) ' Die gesamte Textdatei in einem Rutsch lesen
objFile.Close ' Datei wieder schließen
' *** Vorbereitung ***
Set objRegExp = New RegExp ' Objekt für Verwendung von Regulären Ausdrücken erstellen
objRegExp.Global = True ' True: In der gesamten Zeichenkette suchen
objRegExp.IgnoreCase = True ' True: Groß/Kleinschreibung ignorieren
' *** 1. Schritt ***
REM Das Zeichen " (falls überhaupt vorhanden) entfernen
objRegExp.Pattern = Chr(34) ' Suchmuster Chr(34) setzen (Chr(34) entspricht dem Zeichen ")
strFileContent = objRegExp.Replace(strFileContent, "") ' Suchmuster im Text durch 'nichts' ersetzen, d.h entfernen
' *** 2. Schritt ***
REM Dieser Text steht immer in der ersten Zeile und soll entfernt werden
REM - funktioniert jetzt auch
objRegExp.Pattern = strDatabaseZeile ' Suchmuster Database ... setzen
strFileContent = objRegExp.Replace(strFileContent, "") ' Suchmuster im Text durch 'nichts' ersetzen, d.h entfernen
' *** 3. Schritt ***
REM Diese Zeile kommt mehrfach in der Datei vor - soll als erste Zeile in der Datei
REM erhalten bleiben und als Header dienen.
REM Zwischen dieser Zeile und den nachfolgenden Daten soll keine Leerzeile sein.
REM Alle Zeilen dieser Art werden gelöscht
REM - funktioniert, alle Zeile werden entfernt
objRegExp.Pattern = vbCrLf & strHeaderzeile1 ' Suchmuster KNR ... setzen
strFileContent = objRegExp.Replace(strFileContent, "") ' Suchmuster im Text durch 'nichts' ersetzen, d.h entfernen
' *** 4. Schritt ***
REM Diese Zeile steht immer unter der .o. a. Textzeile - kommt mehrfach vor und soll gelöscht werden
REM - funktioniert, alle Zeilen werden gelöscht!
objRegExp.Pattern = strHeaderzeile2 ' Suchmuster ===== ... setzen
strFileContent = objRegExp.Replace(strFileContent, "") ' Suchmuster im Text durch 'nichts' ersetzen, d.h entfernen
' *** 5. Schritt ***
REM Dieser Wert kommt mehrfach in der Datei vor und soll durch Leerstellen ersetzt werden
REM - funktioniert, alle diesbezüglichen Werte werden ersetzt!
objRegExp.Pattern = "<null>" ' Suchmuster <null> setzen
strFileContent = objRegExp.Replace(strFileContent, Space(6)) ' Suchmuster im Text durch 6 Leerzeichen ersetzen
' *** 6. Schritt ***
REM Die erste Headerzeile voranstellen
strFileContent = strHeaderzeile3 & strFileContent ' 1 Headerzeilen dem bearbeiteten Text voranstellen
' *** 7. Schritt ***
Set objFile = objFSO.OpenTextFile(strFilename, 2) ' Ausgabedatei öffnen als Textdatei
objFile.Write strFileContent ' Den bearbeiteten Text schreiben
objFile.Close ' Ausgabedatei schließen
Was gebt ihr eigentich auf Google so ein um das zu finden? :D[/quote]
Auch Deine Frage möchte ich nicht unbeantwortet lassen. Unter Google habe ich die Begriffe "vbscript textdatei durchsuchen text löschen" benutzt und bin dann ziemlich schnell hier gelandet. :D
M f G
Thunderbird
Firefall
03.11.2007, 18:44
Okay :) Schön das es jetzt funktioniert! :P Du hattest ja ziemlich genaue Vorstellungen wie das Resultat deiner Suche aussehen sollte :D
Klar :D Sage nochmal was du genau willst, hab's nicht begriffen wie's sein soll.
Ich möchte mich hier mal hilfesuchend einmischen. Nachfolgend steht ein kleines NC-Programm. Gern würde ich aus solchen Programmen den String "+-" durch nur "-" ersetzen wollen.
aus:
71
81
5
38
+2086+7001
6
7
38
+177+-177
+-747+0
+-133+-133+0+-133+
+0+-4315
+262+-502+613+0+
+1037+-725
+508+726+254+363+
+-713+498
+-208+399+279+399-
+-0+4052
+-208+399+-487+-0+
+-713+498
+508+726+254+363-
+1037+-725
+262+-502+-351+-502-
+0+-4315
+-133+-133+-133+0-
+-748+0
+71+-71
+1399+0
+200+200+0+200+
+0+4125
8
99
soll also werden:
71
81
5
38
+2086+7001
6
7
38
+177-177
+-747+0
+-133-133+0-133+
+0-4315
+262-502+613+0+
+1037-725
+508+726+254+363+
+-713+498
+-208+399+279+399-
+-0+4052
+-208+399-487-0+
+-713+498
+508+726+254+363-
+1037-725
+262-502-351-502-
+0-4315
+-133-133-133+0-
+-748+0
+71-71
+1399+0
+200+200+0+200+
+0+4125
8
99
Mit den im Forum vorgeschlagenen Mitteln habe ich es erfolglos versucht. Es gelang mir nur alle "-" durch "+" zu ersetzen, umgekehrt ging das schonmal nicht. Auch konnte ich nicht "+-" durch "-", die eigentliche Aufgabe, ersetzen. Scheinbar gibt es mit "-" oder "+" Schwierigkeiten.
Bisher erledige ich das per Edit, schöner wäre es zunächst eine solche Datei mittels drag&drop, ohne jede weitere Abfrage (möglichst keine zusätzlichen Klick´s, die Aufgabe bleibt ja konstant), zu ändern.
Kann ich hier mit Hilfe rechnen?
hpp
Firefall
13.10.2008, 16:03
Ja kannst du. Aber erstelle nächstes Mal einen neuen Thread.
Hier dein fertiges Prog:
strAppName = "RegExpRename"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objRegExp = New RegExp
objRegExp.Global = True
objRegExp.Pattern = "\+-"
objRegExp.IgnoreCase = True
strReplacePattern = "-"
For Each strArgument In WScript.Arguments
Set objFile = objFSO.GetFile(strArgument)
intFileSize = objFile.Size
Set objFile = objFile.OpenAsTextStream()
strFileContent = objFile.Read(intFileSize)
objFile.Close
strFileContent = objRegExp.Replace(strFileContent, strReplacePattern)
Set objFile = objFSO.CreateTextFile(strArgument)
objFile.Write strFileContent
objFile.Close
Next
MsgBox "OK!", vbInformation, strAppName
Du darfst + nicht einfach so verwenden sondern musst es als \+ schreiben. Das nennt sich dann Escaping. Das Problem ist, dass das + eine RegExp-Funktion hat: Es bewirkt, dass das Zeichen, welches davor steht, ein oder mehrmals vorkommen muss. a+ würde also a, aa, aaa usw ersetzen.
PS. Mein Script wird langsam zu ner Grossmacht :D Wenn ich da einen Backdoor eingebaut hätte :P
Danke für die schnelle Hilfe, funktioniert wunderbar. Jetzt habe ich noch eine Frage. Bei meinen Recherchen nach einer Lösung sind mir auch als Nichtprogrammierer solche Funktionen wie Findfirst nicht entgangen. Läßt sich das Programm vielleicht so stricken, daß es, einmal gestartet, das Verzeichnis in dem es sich befindet überwacht und jede Datei die neu eingetragen oder verändert wird dieser Prozedur "+-" unterzogen wird oder muß man da doch an Pascal oder andere Mittel denken?
hpp
Firefall
13.10.2008, 20:25
Danke für die schnelle Hilfe, funktioniert wunderbar. Jetzt habe ich noch eine Frage. Bei meinen Recherchen nach einer Lösung sind mir auch als Nichtprogrammierer solche Funktionen wie Findfirst nicht entgangen. Läßt sich das Programm vielleicht so stricken, daß es, einmal gestartet, das Verzeichnis in dem es sich befindet überwacht und jede Datei die neu eingetragen oder verändert wird dieser Prozedur "+-" unterzogen wird oder muß man da doch an Pascal oder andere Mittel denken?
hpp
Nun du kannst in bestimmten Zeitintervallen, z.b. 5 Minuten, alle Dateien checken lassen und ersetzen - etwas ineffizient je nach Datenmengen. Oder auch beim Boot. Wenn du nur neue/veränderte checken willst, wird's etwas komplizierter, für sowas habe ich keine Zeit, da müsstest du dich schon selbst einarbeiten - was aber schwierig sein dürfte (Ich meine schwierig bis du als Nichtprogrammierer, wie du dich bezeichnest, hast, was du willst). Auch dann bleibt aber der Intervall bestehen. Wenn du wirklich Veränderungen abfangen willst, brauchst du eine andere Sprache. C++ z.B. oder Assembler. Thema: Hooks.
Das dachte ich mir schon. Es muß alles in einem bestimmten Rahmen bleiben. Außerdem ist die Baustelle ja noch größer und für diesen Part gibt es dank Deiner Hilfe eine brauchbare Lösung.
Mit besten Grüßen
HP
Firefall
16.02.2009, 23:09
Gibt mal n Update... Script kann jetzt Ordner rekursive durchsuchen und ersetzen, weil ich gemerkt habe, wenn man 100 Dateen auswählt wird die Argumentenliste zu lang. Beim neuen Script kann man einen Ordner droppen. Achtung, es werden ALLE Unterordner mit einbezogen. Bitte NICHT C:\ droppen ;)strAppName = "RegExpReplace"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objRegExp = New RegExp
objRegExp.Global = True
objRegExp.Pattern = Eval(InputBox("Enter search pattern:", strAppName, Chr(34) & Chr(34)))
If MsgBox("Ignore case?", vbYesNo, strAppName) = vbYes Then
objRegExp.IgnoreCase = True
Else
objRegExp.IgnoreCase = False
End If
strReplacePattern = Eval(InputBox("Enter replace pattern:" & vbCrLf & "($1 - $9 contain submatches)", strAppName, Chr(34) & Chr(34)))
For Each strArgument In WScript.Arguments
If objFSO.FolderExists(strArgument) Then
ReplaceInFolder(strArgument)
Else
ReplaceInFile(strArgument)
End If
Next
MsgBox "OK!", vbInformation, strAppName
Function ReplaceInFile(strFilePath)
Set objFile = objFSO.GetFile(strFilePath)
intFileSize = objFile.Size
Set objFile = objFile.OpenAsTextStream()
strFileContent = objFile.Read(intFileSize)
objFile.Close
strFileContent = objRegExp.Replace(strFileContent, strReplacePattern)
Set objFile = objFSO.CreateTextFile(strFilePath)
objFile.Write strFileContent
objFile.Close
End Function
Function ReplaceInFolder(strFolderPath)
Set objFolder = objFSO.GetFolder(strFolderPath)
For Each objFile in objFolder.Files
ReplaceInFile(objFile.Path)
Next
For Each objSubFolder In objFolder.SubFolders
ReplaceInFolder(objSubFolder.Path)
Next
End Function
Hallo,
ich bin eignetlich begeistert von dem kleinen Script, eingegebene Zeichen werden gelöscht. Könnte jemand mir aber bitte sagen, wie auch gleichzeitig die Zeilen damit gelöscht werden? Denn es bleiben zum Schluss die Leerzeilen übrig, die bei mir gelöscht werden müssen!
Vielen Dank für eure Hilfe!!!
OKIAM
Sowas dürfte gehen:
strAppName = "RegExp Replace"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objRegExp = New RegExp
objRegExp.Global = True
objRegExp.IgnoreCase = True
objRegExp.Pattern = InputBox("Enter search pattern for files:", strAppName)
strReplacePattern = Eval(InputBox("Enter replace pattern for file " & strArgument & ":", strAppName, Chr(34) & Chr(34)))
For Each strArgument In WScript.Arguments
Set objFile = objFSO.GetFile(strArgument)
intFileSize = objFile.Size
Set objFile = objFile.OpenAsTextStream()
strFileContent = objFile.Read(intFileSize)
objFile.Close
strFileContent = objRegExp.Replace(strFileContent, strReplacePattern)
Set objFile = objFSO.OpenTextFile(strArgument, 2)
objFile.Write strFileContent
objFile.Close
Next
MsgBox "Replacements applied to all files!", vbOKOnly, strAppNameBitte daran denken, dass das Replace-Pattern mit Eval() abgearbeitet wird; das bedeutet für den User, dass Strings mit " eingegrenzt werden müssen. Falls du noch eine RegExp brauchst für dein Problem, dann frag bitte im RegExp-Forum ;)
Firefall
27.07.2010, 11:18
Die Zeile kannst du löschen, indem du an das Ende deines Ausdrucks \x0D\x0A anfügst. Das repräsentiert den Zeilenumbruch. Beispiel:
123
456
789
Mit 456\x0D\x0A als Search-Pattern (Und leerem Replace-Pattern) liefert
123
789
Ich lese das hier schon eine Weile und vielleicht könnte eines meiner uralten Programme namens WANDLER diese Probleme alle lösen.
Es funktioniert sowohl mit einer "Oberfläche", als auch als Kommandozeilen-Tool.
Man kann entweder eine Umwandlungstabelle angeben (kann man sowohl in WANDLER erstellen, als auch in irgend einem anderen Editor) oder man kann die zu wandelnden Dinge direkt angeben.
Direkt geht es zum Bespiel so:
WANDLER Datei /:string1 /:string2 /:string3 /:string4 ...
Wobei dann string1 in string2 und string3 in string4 gewandelt wird. Um es in "nichts" zu wandeln, einfach nur /: angeben. Wenn es der letzte String ist, kann man es auch weglassen. Um z.B. das Wort file aus einer Datei zu löschen:
WANDLER Datei /:file
Es arbeitet übrigens case-insensitive, d.h. es unterscheidet NICHT zwischen Groß- und Kleinschreibung! Soll er stattdessen case-sensitive arbeiten, dann als Parameter /c angeben.
Außerdem kann man auch /o benutzen, dann wird das ursprüngliche File mit der Erweiterung OLD versehen. (Geht auch mehrstufig, mit OL1, OL2 usw) aber weiß grad den Parameter nicht auswendig. Und wenn man will, kann man auch leading und trailing blanks (Leerzeichen am Zeichenanfang davor und/oder am Zeilenende) entfernen lassen.
Achja: Falls Zeichen/Bytes benutzt werden sollen, die nicht als Parameterzeile übergeben werden können, kann man sie durch @HEX angeben. Dabei sind die Buchstaben des Hex groß zu schreiben und immer 2 Zeichen zu benutzen (ist Absicht, damit man nicht in jedem Fall @ durch @40 ersetzen muß, sondern nur, wenn dahinter valider Hex-Code).
Also, um z.B. ein LF am Zeilenende durch CRLF zu ersetzen:
WANDLER Datei /:@0A /:@0D@0A
Es gibt noch ein paar mehr Parameter... Aber zu dem Teil gibt's auch eine deutsche Beschreibung.
Falls das also jemand brauchen sollte, es ist da:
http://www.imperial-games.de/html/dosa3.htm
zu finden.
Leider arbeitet es mit 8.3 Files (also den "DOS"-Entsprechungen der Long Filenames), aber vielleicht bau ich mal einen neuen Wandler, der dann auch LFN unterstützt und schneller arbeitet.
Firefall
27.07.2010, 16:55
Zugegeben die Anwendungen der Leute hier sind trivial für meinen Code, ich habe das ursprünglich entwickelt um kompliziertere Aufgaben durchzuführen als nur ein Wort zu ersetzen. Das kann man mit jedem beliebigen Editor. Die eigentliche Stärke liegt in den RegExp-Ausdrücken. Damit kann man ganze Files umformatieren, ungewünschtes automatisiert löschen usw...
Ich wollte mal ein großes Dankeschön posten für eure Hilfe!
Aufgrund vieler Google-Seiten wurde mir aber deutlich, dass dieses Problem sehr oft auftritt! Damit hoffe ich also auch, dass ihr ganz vielen Leuten helfen konntet!
Danke,
OKIAM
thunderbird
29.07.2010, 10:30
Ich kann mich dem nur anschließen! Für mich als Nichtprogrammierer sind diese Boards ausgesprochen hilfreich. Also auch von mir ein ganz großes Dankeschön für Eure unermüdliche Hilfe!
Danke,
Thunderbird
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.