an34mem
Goto Top

RegEx Ergebnisse verbinden und neu in Datei schreiben (PowerShell)

Hallo.
Leider komme ich mit einem kleinen Problem aktuell nicht weiter,
und hoffe das mir jemand kurz weiterhelfen kann.

Ich möchte aus einer Datei bestimmte Zeilen auslesen, und die Werte miteinander dann verbinden.
Im Anschluss wieder in die Datei schreiben lassen.

$Dateien = Get-ChildItem "C:\test\"  
foreach ($Datei in $Dateien) {
$TXT = Get-Content $Datei
$RegEx1 = @('\d{1,4}_\d{1,2}x\d{1,2}_') # Beispiel: 99_01x02_700_  
$RegEx2 = @('\d{1,2}x\d{1,2}')		# Beispiel: 01x02  
$a = [regex]::Matches($TXT, $RegEx1) | foreach {"$_`r`n"}  
$b = [regex]::Matches($TXT, $RegEx2) | foreach {"$_`r`n"}  

write-host $a
write-host $b
}

Die RegEx Suchmuster sind in Ordnung, jedoch leider kann ich z.B.
das Ergebnis von RegEx1 nicht mit RegEx2 verbinden.
Beispiel:
Aus '99_01x02_700_' soll dann: '01x0299_01x02_700_' werden.
Mit '+' ($c = $a + $b) und -join habe ich es versucht, was aber leider nicht funktioniert hat.
Hat jemand eine Idee?

Danke für eure Hilfe.
Gruß

Content-ID: 2073125213

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

Ausgedruckt am: 19.12.2024 um 14:12 Uhr

1915348599
1915348599 05.03.2022 aktualisiert um 16:38:13 Uhr
Goto Top
Die RegEx Suchmuster sind in Ordnung,
Nöp sind sie nicht, der Regex hier
$RegEx1 = @('\d{1,4}_\d{1,2}x\d{1,2}_')
passt bspw. nicht auf dein Beispiel
# Beispiel: 99_01x02_700_
Da fehlt der hintere Teil für 700_ im Regex...

Regex Matches sind Objekte und musst du auch die passende Property wählen (Regex auf dein Beispiel korrigiert ...
foreach ($datei in Get-ChildItem "C:\test" -File) {  
    $txt = @(Get-Content $Datei.Fullname -raw)
    $a = [regex]::Match($txt,'(?i)\d{1,4}_\d{1,2}x\d{1,2}_\d{1,3}_').Value  
    $b = [regex]::Match($txt,'(?i)\d{1,2}x\d{1,2}').Value  
    $joined = $a+$b
    $joined
}
AN34Mem
AN34Mem 06.03.2022 um 08:25:06 Uhr
Goto Top
Vielen Dank Pretty für deinen Lösungsvorschlag.
Das Beispiel hat mir gut weitergeholfen.
Die '700_ ' wurde bewusst nicht deklariert, da eigentlich nur das gesucht wurde was davorstand.

Noch einen schönen Sonntag.
AN34Mem
AN34Mem 06.03.2022 aktualisiert um 14:38:14 Uhr
Goto Top
Hallo.
Ich muss leider nochmal meine Frage aufgreifen, da ich auf ein anderes Problem gestoßen bin.
Das mit den $joined hat soweit geklappt, nun ist das Problem das ich nicht mit dem (RegEX) Suchmuster
gleich alle Fundstellen in der Datei ersetzen kann.

Ich hatte nun versucht mit:
$test = $0 = $a.Value; $1 = $b[1].Value
$txt = $txt -replace "$test","$joined"  

und mit
$test2 = $2 = $a[2].Value; $3 = $b[3].Value
 $txt= $txt -replace "$test2","$joined"  
... etc...

das Problem zu lösen, aber das ist irgendwie nicht richtig wenn man
bedenkt das man x Stellen zu ändern hat.

Wie bitte kann man das mit einer Schleife machen, das alle gefundene Stellen gleich ersetzt werden?
Sorry. Aber ich komme einfach nicht weiter, und hoffe das jemand nochmal kurz helfen kann.
Vielen Dank!
1915348599
1915348599 06.03.2022 aktualisiert um 14:57:38 Uhr
Goto Top
Dann erklär uns doch mal was du überhaupt durch was ersetzen willst, so das es auch ein außenstehender nachvollziehen kann, und bitte diesmal doch bitte ohne Fehler und nicht passende Beispiele ... Am besten gleich mit Voher/Nachher Vergleichsbeispiel in Codetags, Danke!
In der Regel ist [regex]:Replace() dein bester Freund.
AN34Mem
AN34Mem 06.03.2022 um 15:22:28 Uhr
Goto Top
Hallo Pretty.
Ich erkläre es gerne nochmal.
Ich habe eine Datei mit solchen Inhalt:
99_01x02_700_
88_05x05_400_
77_09x07_500_
etc...

Die Datei soll durchsucht werden, und alle 01x02, 05x05, 09x07
worauf das \d{1,2}x\d{1,2} passt, am Anfang der jeweiligen Zeile gesetzt werden.

Das Ergebnis muss dann so aussehen:
Aus:
99_01x02_700_
wird 
01x0299_01x02_700_
Aus:
88_05x05_400_
05x0588_05x05_400_

Das ist wonach gesucht wird.
1915348599
Lösung 1915348599 06.03.2022 um 15:28:56 Uhr
Goto Top
foreach ($datei in ls 'D:\Ordner' -File){  
    [regex]::replace((gc $datei.Fullname -raw),'(?im)^.*?(\d{1,2}x\d{1,2}).*','$1$0') | set-content $datei.FullName  
}
AN34Mem
AN34Mem 06.03.2022 um 15:33:26 Uhr
Goto Top
Genau das ist es!
Ich weiß nicht wie Du das so schnell hinbekommen hast,
aber ein dickes DANKE!