Warum findet dieses FINDSTR-Beispiel mit mehreren literalen Suchzeichenfolgen keine Übereinstimmung?

8

Das folgende FINDSTR-Beispiel findet keine Übereinstimmung.

%Vor%

Warum?

    
dbenham 19.01.2012, 05:01
quelle

2 Antworten

13

Scheinbar ist das ein langjähriger FINDSTR-Bug. Ich denke, dass es je nach den Umständen ein lähmender Bug sein kann.

Ich habe bestätigt, dass der Befehl auf zwei verschiedenen Vista-Rechnern, einem Windows 7-Rechner und einem XP-Rechner fehlschlägt. Ich fand diesen findstr - broken ??? Link, der eine ähnliche Suche unter Windows meldet Server 2003, aber es gelingt unter Windows 2000.

Ich habe eine Reihe von Experimenten durchgeführt und es scheint, dass alle folgenden Bedingungen erfüllt sein müssen, damit ein Fehler auftreten kann:

  • Die Suche verwendet mehrere literale Suchzeichenfolgen
  • Die Suchstrings sind unterschiedlich lang
  • Eine kurze Suchzeichenfolge hat eine gewisse Überlappung mit einer längeren Suchzeichenfolge
  • Bei der Suche wird zwischen Groß- und Kleinschreibung unterschieden (keine Option /I )

Bei jedem Fehler, den ich gesehen habe, ist immer einer der kürzeren Suchbegriffe fehlgeschlagen.

Es spielt keine Rolle, wie die Suchzeichenfolgen angegeben werden. Das gleiche fehlerhafte Ergebnis wird mit mehreren Optionen /C:"search" und mit der Option /G:file erreicht.

Die einzigen drei Problemumgehungen, auf die ich gekommen bin, sind:

  • Verwenden Sie die Option /I , wenn Sie die Groß- / Kleinschreibung nicht beachten. Offensichtlich entspricht dies nicht Ihren Anforderungen.

  • Verwenden Sie die Option /R regulärer Ausdruck. Aber wenn Sie das tun, dann müssen Sie sicherstellen, dass Sie alle Meta-Zeichen in der Suche so entgehen lassen, dass sie mit dem Ergebnis einer literalen Suche übereinstimmen. Dies kann auch problematisch sein.

  • Wenn Sie die Option /V verwenden, verwenden Sie mehrere piped FINDSTR-Befehle mit jeweils einer Suchzeichenfolge anstelle von einem FINDSTR mit mehreren Suchvorgängen. Dies kann auch ein Problem sein, wenn Sie viele Suchzeichenfolgen haben, für die Sie die Option /G:file verwenden möchten.

Ich hasse diesen Fehler !!!!

Hinweis - Siehe Was sind die undokumentierten Funktionen und Einschränkungen? des Windows FINDSTR-Befehls? für eine umfassende Liste von FINDSTR Idiosynkrasien.

    
dbenham 19.01.2012, 05:05
quelle
1

Ich kann nicht sagen, warum findstr mit mehreren Literalstrings fehlschlägt. Ich kann jedoch eine Methode zur Verfügung stellen, um diesen nervigen Fehler zu umgehen.

Vorausgesetzt, dass die literalen Suchzeichenfolgen in einer Textdatei mit dem Namen search_strings.txt ...:

aufgelistet sind
%Vor%

... können Sie es in reguläre Ausdrücke konvertieren, indem Sie vor jedes einzelne Zeichen einen umgekehrten Schrägstrich einfügen:

%Vor%

Verwenden Sie dann die konvertierte Datei regular_expressions.txt ...:

%Vor%

... um eine Suche mit regulärem Ausdruck durchzuführen, die auch mit mehreren Suchzeichenfolgen funktioniert:

%Vor%

Die vorhergehenden umgekehrten Schrägstriche entziehen sich einfach allen Zeichen einschließlich derjenigen, die eine besondere Bedeutung bei der Suche nach regulären Ausdrücken haben.

Die Zeichen < und > werden nicht maskiert, um Konflikte mit Wortgrenzen zu vermeiden, die am Anfang und am Ende eines Suchstrings durch \< und \> ausgedrückt wurden , jeweils.

Da reguläre Ausdrücke für findstr -Versionen nach Windows XP auf 254 Zeichen beschränkt sind (im Gegensatz zu Literalzeichenfolgen, die auf 511 Zeichen beschränkt sind), ist die Länge der ursprünglichen Suchzeichenfolgen auf 127 Zeichen begrenzt, weil jedes Zeichen wird aufgrund der Flucht durch zwei Zeichen ausgedrückt.

Hier ist ein alternativer Ansatz, der nur die Metazeichen . , * , ^ , $ , [ , ] , \ , " :

%Vor%

Der Vorteil dieser Methode besteht darin, dass die Länge der Suchstrings nicht länger auf 127 Zeichen begrenzt ist, sondern auf 254 Zeichen minus 1 für jedes vorgenannte Metazeichen. Dies gilt für findstr Versionen nach Windows XP.

Hier ist eine weitere Problemumgehung, die eine Suche ohne Berücksichtigung der Groß- / Kleinschreibung mit findstr an erster Stelle und dann das Nachfiltern des Ergebnisses nach Groß- und Kleinschreibung verwendet:

%Vor%

Die Doppel-Escape-Ausrufezeichen stellen sicher, dass die Variable STR in der explizit aufgerufenen cmd -Instanz erweitert wird, auch wenn die verzögerte Erweiterung in der hosting cmd -Instanz aktiviert ist.

Übrigens funktionieren Suchen mit Literalstrings mit findstr aufgrund eines Entwurfsfehlers nie zuverlässig, sobald sie umgekehrte Schrägstriche enthalten, weil sie möglicherweise weiterhin benötigt werden, um folgenden Metazeichen zu entkommen, obwohl dies nicht notwendig ist ; Beispielsweise entspricht die Suchzeichenfolge \. tatsächlich . ; Um wirklich \. wörtlich zu entsprechen, müssen Sie die Suchzeichenfolge \. angeben. Ich verstehe nicht, warum Meta-Zeichen immer noch erkannt werden, wenn ich literale Suchen durchführe, das nenne ich nicht wörtlich.

    
aschipfl 04.06.2017 22:02
quelle

Tags und Links