an34mem
Goto Top

Powershell: Inhalt von 2x TXT Dateien mit RegEX vergleichen und ggf. Zeilen löschen

Guten Morgen.
Vorab wünsche ich Euch allen nachträglich ein frohes und gesundes neues Jahr.

Leider habe ich ein kleines Problem und finde keinen Lösungsweg.
Ich habe zwei TXT Dateien.
Beispiel: 1. TXT (Ohne weiteren Zwischentext):
12_12_xxx.abc
932_932_xxx.abc
1198_1198_xxx.abc

Beispiel: 2. TXT:
Duis autem vel eum iriure dolor. 
7_7_xxx.abc 7a
12_12_xxx.abc 12a
Duis autem vel eum iriure dolor.
852_852_xxx.abc 852a
909_909_xxx.abc 909a
Eel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et.
932_932_xxx.abc 932a
1198_1198_xxx.abc 1198a

Ziel ist es dieses Ergebnis in einer neuen TXT zu speichern:
Duis autem vel eum iriure dolor. 
7_7_xxx.abc 7a
Duis autem vel eum iriure dolor.
852_852_xxx.abc 852a
909_909_xxx.abc 909a
Eel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et.

Bei der zweiten TXT sind die Zahlen hinter der Leertaste nicht relevant und können ignoriert werden (z.B. 12a, oder 1198a etc...).
Wichtig für das "Suchen und Ersetzen" sind immer die Zeilen mit Beginn der Zahlen (z.B. 909_909 etc.).

Um die erste TXT durchsuchen zu können kann man ggf. diesen RegEX (hxxx://regex101.com) verwenden:
\d{1,4}_\d{1,4}_[a-z]{1,}.[a-z]{3}
Und bei der zweiten TXT diesen:
\d{1,4}_\d{1,4}_[a-z]{1,}.[a-z]{3} \d{1,4}[a-z]

Beispiel 2. TXT:
clear host
$regex = "\d{1,4}_\d{1,4}_[a-z]{1,}.[a-z]{3} \d{1,4}[a-z]"  
# 1198_1198_xxx.abc 1198a

Get-ChildItem  ".\b.txt" |  
Foreach-Object {
    $b = ($_ | Get-Content)
    $b = $a -replace $regex,''  
    [IO.File]::WriteAllText($_.FullName, ($b -join "`r`n"))  
}

Hierbei werden ggf. Zeilen per RegEX gefunden und entfernt.

Wie kann man nun mit ggf. - compare / - replace einen Abgleich der 1. mit der 2. TXT durchführen, und die fast identische Zeilen in der 2. TXT löschen?
Bekannt ist mir die leere Zeilen am Ende mit:
Get-Content ".\b.txt" | where {$_ -ne ""} | Out-File ".\c.txt"  
zu entfernen.

compare -ReferenceObject (Get-Content ".\a.txt") -DifferenceObject (Get-Content ".\b.txt") > .\ok.txt  
hilft mir leider dabei nicht weiter, weil ohne RegEX keine fast identische Zeilen gefunden werden.

Ich habe an einen array Vergleich + RegEX gedacht, aber leider weiß ich nicht wie man das genau machen kann.

$test1 = @(Get-Content ".\a.txt")  
$test2 = @(Get-Content ".\b.txt")  
$regex = "\d{1,4}_\d{1,4}_[a-z]{1,}.[a-z]{3}"  

if ($test1 -and $test2){
???? compare -ReferenceObject (Get-Content ".\a.txt") -DifferenceObject (Get-Content ".\b.txt") ???  
??? (Get-Content $test2) "$regex", "" | Set-Content ".\neu" ???  
}

Ein -split funktioniert leider auch nicht, da zusätzlicher Zwischentext in der 2. TXT steht. Bei einer neuen Suche kann dieser aber auch in einer
anderen Zeile stehen.

Ich vermute das man das "Suchen- und Ersetzen" nur mit compare und RegEx hinbekommt. Nur bitte WIE?
Ich hoffe das jemand vielleicht einen Tipp hat.

Über eine Hilfestellung wäre ich sehr dankbar.
Gruß

Content-Key: 1687393472

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

Printed on: April 26, 2024 at 20:04 o'clock

Mitglied: 149569
Solution 149569 Jan 04, 2022 at 08:16:44 (UTC)
Goto Top
$txt1 = gc ".\a.txt"  
$txt2 = gc ".\b.txt"  
$txt2 | ?{($_ -split '\s+') -notin $txt1} | sc ".\result.txt"  
Member: AN34Mem
AN34Mem Jan 04, 2022 at 11:29:46 (UTC)
Goto Top
Danke hacktor für deinen tollen Lösungsvorschlag!
Ganz ehrlich. Ich hätte nicht gedacht das die Lösung bei -split liegt....
Zwar in Erwägung gezogen, aber viel zu kompliziert das Problem gesehen.

Alles Gute. Bis zum nächsten Mal. Dickes THANK's.