derpeter02
Goto Top

Powershell, Zeilen suchen und Zeilenumbruch entfernen wenn

Moin zusammen,

Hab ein Problem face-sad

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

Content-Key: 3852992915

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

Printed on: May 5, 2024 at 06:05 o'clock

Member: Crusher79
Crusher79 Sep 06, 2022 at 06:20:26 (UTC)
Goto Top
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
Member: DerPeter02
DerPeter02 Sep 06, 2022 at 08:55:22 (UTC)
Goto Top
Ja ne, wenn ich ehrlich bin versteh ich nicht viel davon. Hab gerade so ein Skript hinbekommen welches paar Buchstaben ersetzt.
Die Holzhammermethode klappt aber nicht da es auch noch andere Zeilen gibt, es fangen nicht alle mit H100 oder I00 an. Aber die Rheinfolge ist immer gleich nach H100 kommt i00

Gruß
Peter
Member: TK1987
TK1987 Sep 06, 2022 updated at 10:21:45 (UTC)
Goto Top
Moin Peter,

Zitat von @DerPeter02:
Ist sowas möglich mit Powershell ?
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?
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"," "})  
Member: Crusher79
Crusher79 Sep 06, 2022 at 12:31:37 (UTC)
Goto Top
Vlt. mal einen Auszug - auch anonymisiert - hier reinstellen?

Damit man sieht, was man tut ^^
Member: DerPeter02
DerPeter02 Sep 07, 2022 at 06:45:03 (UTC)
Goto Top
Hallo,

@ TK1987 SUPER, ganz lieben dank

das ist Krass face-smile folgendes klappt

# Quell- und Zieldatei
$Source = "D:\test\test.txt"  
$Target = "D:\test\test2.txt"  

# Quelldatei als Rohtext lesen
$Content = Get-Content -Raw $Source

# Regex-Ersetzungen durchführen

$Content = [regex]::Replace($Content,"(?sm)(^H100.*?)(?=\nI00)",{$Args -replace "\r\n"," "})  

# Zieldatei Ausgeben
$Content | Set-Content $Target


hab zu dem replace noch ein \r hinzugefügt.

Hut ab face-smile

Ich hab für die gleiche Datei noch ein Script laufen, kann man das in das neue Script mit einbauen ?

$ersetzungspfad = "C:\Zwischenablage\*"   
$search = @("ö","ä","ß", "ü")  
$replace = @("oe","ae","ss","ue")  
$schleife = "y"  
$i=0 
if($schleife -ieq "y"){   
    foreach ($s in $search){
        Get-ChildItem -Path $ersetzungspfad -Include *.*,*.properties| Foreach-Object {Get-Content $_ | Out-String | Foreach-Object {$_.Replace($s,$replace[$i])} | Set-Content $_}
        $i++}}

Ja ich weiß, gut zu erkennen das ich da keine Ahnung von habe. Wohl etwas umständlich face-sad
Member: TK1987
Solution TK1987 Sep 07, 2022 at 07:20:53 (UTC)
Goto Top
Moin,

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?
# 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
Member: DerPeter02
Solution DerPeter02 Sep 07, 2022 at 08:03:07 (UTC)
Goto Top
PERFEKT face-smile
Danke face-smile