Wie funktioniert PowerShell Regex mit mehrzeiligen Strings?

8

Okay, das macht mich verrückt, weil meine Regex an Rubular arbeitet, aber PowerShell funktioniert nicht so, wie ich es erwarte.

  1. Ich habe ein Get-ChildItem in einem Netzwerkverzeichnis erstellt und dann die Ausgabe in eine TXT-Datei geleitet.
  2. Ich habe die Verzeichnisinformationen aus der Textdatei entfernt, die wie folgt aussieht:

  1. Wenn ich mit PowerShell versuche, eine Regex zu schreiben, um die Verzeichnisinformationen zu entfernen, stoße ich auf einige Probleme.

Wenn ich verwende:

%Vor%

PowerShell packt den Text, nach dem ich suche, aber es greift nicht auf den Text, der in einer neuen Zeile beginnt, ich bekomme:

%Vor%

Also ... wenn ich benutze:

%Vor%

Ich bekomme nichts ...

Wenn ich das auf Rollar versuche, funktioniert es gut, was fehlt mir hier? Jede Hilfe wäre großartig, danke!

    
Steve 13.06.2012, 13:23
quelle

3 Antworten

19

Filburt's Antwort ist eine gute und es sieht nicht so aus, als ob reguläre Ausdrücke das beste Werkzeug sind, um es hier zu verwenden. Sie sind jedoch auf ein Problem gestoßen, das im weiteren Verlauf Verwirrung stiften kann. Das Problem hierbei ist, dass die Variable Get-Content keine mehrzeilige Zeichenfolge ist. Es ist ein Array von Strings:

%Vor%

Wenn Sie eine Regex-Übereinstimmung mit $var ausführen, stimmt sie mit jedem Objekt im Array (jede Zeile in der Datei) überein. Es kann nicht über das Ende einer Zeile hinaus passen, da die nächste Zeile ein neues Objekt ist.

Eine Umgehungslösung besteht darin, dieses Array von Strings in eine einzelne Zeichenfolge wie folgt zu reduzieren:

%Vor%

In Powershell kann es manchmal schwierig sein zu erkennen, wenn Sie mit einem einzelnen String-Objekt im Gegensatz zu einem Array von Strings arbeiten. Wenn Sie sie auf der Konsole ausgeben, erscheinen sie identisch. In diesen Fällen können GetType() und Out-String nützliche Werkzeuge sein.

Bearbeiten: Ab Powershell 3.0 enthält der Filesystem -Anbieter einen -Raw -Schalter für Get-Content . Dieser Schalter weist Get-Content an, die Datei auf einmal zu lesen, ohne sie in Chunks aufzuteilen. Es ist wesentlich schneller als die Verwendung der Out-String -Ausweichlösung, da es keine Zeit damit verschwendet, Teile auseinander zu ziehen, sondern sie wieder zusammenzusetzen.

    
ajk 13.06.2012, 14:11
quelle
6

Warum wählen Sie nicht die gewünschten Eigenschaften aus, bevor Sie sie in Ihre Datei einfügen?

%Vor%     
Filburt 13.06.2012 13:37
quelle
1

Es ist möglich, dass die Zeilen nicht mit \n enden. Ich glaube, die Standardzeichen für die Zeilenschaltung in Windows ist \r\n . Versuchen Sie, Ihre Regex neu zu schreiben, um dem zu entsprechen.

    
Aaron Jensen 13.06.2012 15:00
quelle

Tags und Links