none
RegEX ueber mehrere Zeilen RRS feed

  • Frage

  • Hallo,

    http://social.technet.microsoft.com/Forums/de-DE/dd77c73b-52ef-42db-817d-9c9ccff18a63/ist-es-mglich-dass-man-in-einer-textdatei-nach-zwei-bestimmten-zeilen-sucht-und-diese-dann-gegen?forum=powershell_de

    in dem obigen Thread geht es darum, an Hand eins bestimmten Inhaltes einer Zeile, die naechst folgende zu aendern, die allerdings mehrmals vorkommen kann.

    Peter hat ja einen Loesungsvorschlag gemacht, ich dachte mir das sollte auch mit einem Regulaeren Ausdruck gehen

    Ich definiere mir also die Variable $a

    $a = "11111111
    enabled: True
    22222222
    enabled: True
    33333333
    enabled: True
    44444444
    enabled: True
    55555555
    enabled: True
    66666666
    enabled: True"

    Wenn in einer Zeile 44444444 steht soll in der folgenden zeile aus True False werden.

    Dies kann ich z.B.: so

    $a -replace '(44444444\nenabled: )True','$1False'
    
    # oder so machen.
    
    [regex]::Replace($a, '(44444444\nenabled: )True','$1False')

    und erhalte jeweils:

    11111111
    enabled: True
    22222222
    enabled: True
    33333333
    enabled: True
    44444444
    enabled: False
    55555555
    enabled: True
    66666666
    enabled: True

    Wenn ich nun aber die Zeilen als Text im Notepad erfasse und diese Textdatei in eine Variable einlese funktioniert der RegEX nicht mehr, was wohl daran liegt, das Get-content die Zeilen einzeln nach $b liefert, $b also am Ende ein Array ist, also wenn ich $a und $b ausgebe ist der Inhalt gleich. $a.count liefert nichts, $b.count liefert 12, also besteht der Text(4b) aus 12 Zeilen, $a ist wohl dann eine Zeile die ein paar Zeilenumbrueche enthaelt. Also muss das Problem was mit den Umbruechen zu tun haben.

    Das sollte ja zu loesen sein, wenn man mit einem Null Delimiter beim Get-content arbeitet.

    $b = get-content xx.txt -Delimiter '`0'

    Jetz erhalte ich auch fuer $b.Count keinen Wert mehr, allerdings greift der RegEX

    $b -replace '(44444444\nenabled: )True','$1False'



    trotzdem nicht.

    Hat da einer eine Idee Tipp fuer mich!

    Beste Gruesse
    brima



    • Bearbeitet brima Freitag, 18. Oktober 2013 14:10
    Freitag, 18. Oktober 2013 14:06

Antworten

  • Ich bin kein Regex Experte...

    Aus sich von Regex ist der ganze Text ja nur ein Byte Array und ALLE Zeichen sind erstmal gleich. Für Regex gibt es erstmal keine Zeilen oder Wörter...
    Die Zeilen Vorschubzeichen fallen auch in die Klasse Whitespace (nichtdruckbare Zeichen).Deshalb kannst du diese z.B. mit \s* maskieren.

    $b = get-content D:\temp\regex.txt -Delimiter '`0'
    $b -match '44444444\s*enabled:\s*False'
    $matches[0]


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    • Als Antwort markiert brima Freitag, 18. Oktober 2013 17:35
    Freitag, 18. Oktober 2013 16:30

Alle Antworten

  • Ich bin kein Regex Experte...

    Aus sich von Regex ist der ganze Text ja nur ein Byte Array und ALLE Zeichen sind erstmal gleich. Für Regex gibt es erstmal keine Zeilen oder Wörter...
    Die Zeilen Vorschubzeichen fallen auch in die Klasse Whitespace (nichtdruckbare Zeichen).Deshalb kannst du diese z.B. mit \s* maskieren.

    $b = get-content D:\temp\regex.txt -Delimiter '`0'
    $b -match '44444444\s*enabled:\s*False'
    $matches[0]


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    • Als Antwort markiert brima Freitag, 18. Oktober 2013 17:35
    Freitag, 18. Oktober 2013 16:30
  • Hallo Peter,

    vielen Dank, das ist die Loesung. Ich hatte mich irgendwie an den Vorschubzeichen \n \r festgebissen usw.

    Beste Gruesse
    brima

    Freitag, 18. Oktober 2013 17:35