Powershell nach String suchen?
Hi,
ich soll in einer Text Datei mithilfe eines Skripts bestimmte Namen finden, welche ein "ey" und "ay" enthalten. Diese sollen dann ausgegeben werden. Diese Namen sollen dann ausgegeben werden und die beiden Teile anschließend mit "ei" getauscht werden.
Die gesuchten strings sollen, wenn sie am Anfang stehen ignoriert werden.
Wäre für Tipps dankbar.
Mfg
3 Antworten
Mit Foreach könntest du einen array auslesen und verarbeiten (Datei Zeilen oder nach einem Split bei Komma zum Beispiel)
Und so findest du die Wörter (Laut Stackoverflow mit "Match")
Falls du was splitten musst
Du kannst mit Substring schauen, ob es die ersten oder letzten Buchstaben sind
https://www.windowspro.de/script/variablen-powershell-namen-werte-datentypen
Du kannst in Variablen deine Werte zwischenspeichern und du hast scheinbar substring nicht verstanden ... Du kannst nicht nur die ersten Buchstaben entfernen ... Es gibt viele mehr Möglichkeiten. Gib das am besten selber mal bei Google ein und schaue, welche Seite dir das sonst besser erklärt, als die, die ich gerade gesendet habe
Schade , das Du Dich nicht sehr Präzise ausdrückst...
Die gesuchten strings sollen, wenn sie am Anfang stehen ignoriert werden.
Am Anfang von was? Text? Zeile? Wort?...
Erstmal Grundlegend. Strings oder Teile von Strings tauscht man mit dem -replace-Operator
Der bequemste Weg Das passende Suchmuster zu selektieren ist ein Regex.
Ich habe dafür einen Generator:
Spaß muss sein...
demo.txt :
Mahler schlutzt Meyers Bruder Schulz mit Maya Aysche
Schwupp Layer ruflburz Mayer
Schreyers Maus haurubble Eyliner
Was wollen wir?: alle Worte mit : ein oder mehr Buchstaben und (a oder e)y . (a oder e)y gegen ei tauschen.
#Text nach dem einlesen und an ein oder mehr Leerzeichen zerlegen
$myStringArray=(Get-Content 'demo.txt') -split '\s+'
#anzeigen
$myStringArray
'
gefiltert:
'
#alle Strings im Array welche auf den Pattern: "ein/mehr wortzeichen und (a|e)y" passen filtern ,
$myStringArray|?{$_ -match '\w+(a|e)y'}|%{
#mal zeigen
$_
#da nun sichergestellt ist, das ohenehin Mindestens ein Zeichen davor steht einfach tauschen was zu tauschen ist
$_ -replace '(a|e)y','ei'
''
}
kurtz:
(Get-Content 'demo.txt') -split '\s+'|?{$_ -match '\w+(a|e)y'}|%{$_ -replace '(a|e)y','ei'}
Natürlich kann man auch innerhalb eines Textes den Austausch vornehmen ohne diesen zu zelegen:
Nur (a|e)y sind unser Ziel, schaue vom Treffer zurück ob dort ein oder mehr Wordcharacter steht: (?<=\w+)(a|e)y . Ja das is schon Derb https://www.regular-expressions.info/lookaround.html
einfach unser Regexpattern auf den ganzen Text anwenden:
(Get-Content 'demo.txt') -replace '(?<=\w+)(a|e)y','ei';

Wenn Du gezwungen bist, das mit der Powershell zu machen, habe ich keine passende Lösung, müsste mich erst reinlesen. Reguläre Ausdrücke sind das Mittel der Wahl:
In wenigen Sekunden würde sich das mit Notepad++ erledigen lassen, aber Dir geht es wohl eher darum, etwas zu lernen?
Genau.
Das Problem mit Powershell lösen ist Teil der Aufgabe.
Hi, danke für die Antwort.
Allerdings wird mir mit Substring der erste Buchstabe des Namens weggeschnitten und nicht übersprungen. Was kann man da machen?