Powershell, Zeilen suchen und Zeilenumbruch entfernen wenn
Moin zusammen,
Hab ein Problem
Habe eine Datei in der folgendes geändert werden muß:
Suche eine Zeile die mit „H100“ anfängt, wenn nächste Zeile mit „I00“ anfängt, suche nächste Zeile die mit „H100“ anfängt.
Wenn nächste Zeile nicht mit „I00“ anfängt geh zum Ende der Zeile, füge ein Leerzeichen ein und entferne Zeilenumbruch
Das mach so lange bis nächste Zeile mit „I00“ anfängt
Ist sowas möglich mit Powershell ?
Gruß
Der Peter
Hab ein Problem
Habe eine Datei in der folgendes geändert werden muß:
Suche eine Zeile die mit „H100“ anfängt, wenn nächste Zeile mit „I00“ anfängt, suche nächste Zeile die mit „H100“ anfängt.
Wenn nächste Zeile nicht mit „I00“ anfängt geh zum Ende der Zeile, füge ein Leerzeichen ein und entferne Zeilenumbruch
Das mach so lange bis nächste Zeile mit „I00“ anfängt
Ist sowas möglich mit Powershell ?
Gruß
Der Peter
Please also mark the comments that contributed to the solution of the article
Content-Key: 3852992915
Url: https://administrator.de/contentid/3852992915
Printed on: May 5, 2024 at 06:05 o'clock
7 Comments
Latest comment
Hallo,
kanns grad nicht testen. Ansatz wäre regulärer Ausdruck. Wenn die Zeile nicht mit den Kritereien bnfängt beider Zeile darüber \r\n durch ein "," ersetzen. Oder auch nur \n - je nach Datenquelle.
Holzhammer Methode: Alle Umbrüche entfernen und du hast alles in einer Zeile. Dann geweils vor H100 und 100 \r\n anfügen.
Mit Notepad++ kann man das auch testen. Es funktioniert nur nicht mit 1:1 Kopien des Codeschnipssel. Die Escape Zeichen sind bei PowerShell wieder andre
\r = `r
\n = `n
Aber das wären auf die schnelle 2 Ansätze.
mfg Crusher
kanns grad nicht testen. Ansatz wäre regulärer Ausdruck. Wenn die Zeile nicht mit den Kritereien bnfängt beider Zeile darüber \r\n durch ein "," ersetzen. Oder auch nur \n - je nach Datenquelle.
Holzhammer Methode: Alle Umbrüche entfernen und du hast alles in einer Zeile. Dann geweils vor H100 und 100 \r\n anfügen.
Mit Notepad++ kann man das auch testen. Es funktioniert nur nicht mit 1:1 Kopien des Codeschnipssel. Die Escape Zeichen sind bei PowerShell wieder andre
\r = `r
\n = `n
Aber das wären auf die schnelle 2 Ansätze.
mfg Crusher
Moin Peter,
Sicher, mit Powershell und ein bisschen RegEx kein problem
Bisschen Lesestoff:
Powershell Leitfaden für Anfänger
RegEx-Tutorial
RegEx-Legende
Gruß Thomas
EDIT ---:
Falls ja, wird das Ersetzen ein wenig komplexer. In dem Fall einfach Zeile 9 oben austauschen durch:
Sicher, mit Powershell und ein bisschen RegEx kein problem
# Quell- und Zieldatei
$Source = "C:\Pfad\zur\Quelldatei.txt"
$Target = "C:\Pfad\zur\Zieldatei.txt"
# Quelldatei als Rohtext lesen
$Content = Get-Content -Raw $Source
# Regex-Ersetzungen durchführen
$Content = $Content -Replace "\n(?!I00|H100)"," "
# Zieldatei Ausgeben
$Content | Set-Content $Target
Bisschen Lesestoff:
Powershell Leitfaden für Anfänger
RegEx-Tutorial
RegEx-Legende
Gruß Thomas
EDIT ---:
Zitat von @DerPeter02:
klappt aber nicht da es auch noch andere Zeilen gibt, es fangen nicht alle mit H100 oder I00 an.
Das heisst, diese Zeilen, die anders anfangen, sollen ebenfalls samt Zeilenumbrüchen erhalten bleiben?klappt aber nicht da es auch noch andere Zeilen gibt, es fangen nicht alle mit H100 oder I00 an.
Falls ja, wird das Ersetzen ein wenig komplexer. In dem Fall einfach Zeile 9 oben austauschen durch:
$Content = [regex]::Replace($Content,"(?sm)(^H100.*?)(?=\nI00)",{$Args -replace "\n"," "})
Moin,
Gruß Thomas
Zitat von @DerPeter02:
Ich hab für die gleiche Datei noch ein Script laufen, kann man das in das neue Script mit einbauen ?
Wohl eher Dateien - sicher geht das. Die Quelldateien sollen überschrieben werden?Ich hab für die gleiche Datei noch ein Script laufen, kann man das in das neue Script mit einbauen ?
# Quellpfad
$Source = "C:\Zwischenablage"
# Für jede Datei im Quellpfad...
Foreach ($File in Get-ChildItem -File -Path $Source) {
# Datei Inhalt als Rohtext lesen und Umlaute ersetzen
$Content = (Get-Content -Raw $File).Replace('ä','ae').Replace('ö','oe').Replace('ü','ue').Replace('ß','ss')
# Regex-Ersetzungen durchführen
$Content = [regex]::Replace($Content,"(?sm)(^H100.*?)(?=\r?\nI00)",{$Args -replace "[\r\n]+"," "})
# Zieldatei Ausgeben
$Content | Set-Content $File
} # ENDE Foreach File
Gruß Thomas