Vorwort
Ein Großteil der Informationen in dieser Antwort wurde anhand von Experimenten gesammelt, die auf einem Vista-Computer ausgeführt wurden. Sofern nicht ausdrücklich anders angegeben, habe ich nicht bestätigt, ob die Informationen für andere Windows-Versionen gelten.
FINDSTR-Ausgabe
In der Dokumentation wird die Ausgabe von FINDSTR nie erläutert. Es spielt auf die Tatsache an, dass übereinstimmende Linien gedruckt werden, aber nichts weiter.
Das Format der übereinstimmenden Zeilenausgabe lautet wie folgt:
Dateiname: lineNumber: lineOffset: text
wo
Dateiname: = Der Name der Datei, die die übereinstimmende Zeile enthält. Der Dateiname wird nicht gedruckt, wenn die Anforderung explizit für eine einzelne Datei war oder wenn über Pipeline-Eingaben oder umgeleitete Eingaben gesucht wurde. Beim Drucken enthält der Dateiname immer alle bereitgestellten Pfadinformationen. Zusätzliche Pfadinformationen werden hinzugefügt, wenn die/S
Option verwendet wird. Der gedruckte Pfad ist immer relativ zum angegebenen Pfad oder relativ zum aktuellen Verzeichnis, wenn keiner angegeben ist.
Hinweis - Das Dateinamenpräfix kann beim Durchsuchen mehrerer Dateien mithilfe der nicht standardmäßigen (und schlecht dokumentierten) Platzhalter <
und vermieden werden >
. Die genauen Regeln für die Funktionsweise dieser Platzhalter finden Sie hier . Schließlich können Sie sich dieses Beispiel ansehen, wie die nicht standardmäßigen Platzhalter mit FINDSTR funktionieren .
lineNumber: = Die Zeilennummer der übereinstimmenden Zeile, die als Dezimalwert dargestellt wird, wobei 1 die erste Zeile der Eingabe darstellt. Wird nur gedruckt, wenn die/N
Option angegeben ist.
lineOffset: = Der Dezimalbyte-Offset des Beginns der übereinstimmenden Zeile, wobei 0 das 1. Zeichen der 1. Zeile darstellt. Wird nur gedruckt, wenn die/O
Option angegeben ist. Dies ist nicht der Versatz der Übereinstimmung innerhalb der Linie. Dies ist die Anzahl der Bytes vom Anfang der Datei bis zum Anfang der Zeile.
text = Die binäre Darstellung der übereinstimmenden Zeile, einschließlich aller <CR> und / oder <LF>. In der Binärausgabe wird nichts ausgelassen, sodass in diesem Beispiel, das mit allen Zeilen übereinstimmt, eine exakte Binärkopie der Originaldatei erstellt wird.
FINDSTR "^" FILE >FILE_COPY
Die Option / A legt die Farbe der Ausgabe von fileName:, lineNumber: und lineOffset: fest. Der Text der übereinstimmenden Zeile wird immer mit der aktuellen Konsolenfarbe ausgegeben. Die Option / A wird nur wirksam, wenn die Ausgabe direkt auf der Konsole angezeigt wird. Die Option / A hat keine Auswirkung, wenn die Ausgabe in eine Datei umgeleitet oder weitergeleitet wird. Siehe die 2018.08.18 bearbeiten in Aacini Antwort für eine Beschreibung des Buggys Verhalten , wenn der Ausgang zu CON umgeleitet wird.
Die meisten Steuerzeichen und viele erweiterte ASCII-Zeichen werden unter XP als Punkte
angezeigt. FINDSTR unter XP zeigt die meisten nicht druckbaren Steuerzeichen aus übereinstimmenden Zeilen als Punkte (Punkte) auf dem Bildschirm an. Die folgenden Steuerzeichen sind Ausnahmen. Sie werden als sie selbst angezeigt: Registerkarte 0x09, LineFeed 0x0A, Registerkarte Vertikal 0x0B, Formularvorschub 0x0C, Wagenrücklauf 0x0D.
XP FINDSTR konvertiert auch eine Reihe erweiterter ASCII-Zeichen in Punkte. Die erweiterten ASCII-Zeichen, die unter XP als Punkte angezeigt werden, entsprechen denen, die bei der Eingabe in der Befehlszeile transformiert werden. Weitere Informationen finden Sie im Abschnitt "Zeichenbeschränkungen für Befehlszeilenparameter - Erweiterte ASCII-Transformation" weiter unten in diesem Beitrag
Steuerzeichen und erweitertes ASCII werden unter XP nicht in Punkte konvertiert, wenn die Ausgabe weitergeleitet, in eine Datei oder in eine FOR IN () -Klausel umgeleitet wird.
Vista und Windows 7 zeigen immer alle Zeichen als sich selbst an, niemals als Punkte.
Rückkehrcodes (ERRORLEVEL)
- 0 (Erfolg)
- Übereinstimmung wurde in mindestens einer Zeile von mindestens einer Datei gefunden.
- 1 (Fehler)
- In keiner Zeile einer Datei wurde eine Übereinstimmung gefunden.
- Ungültige Farbe durch
/A:xx
Option angegeben
- 2 (Fehler)
- Inkompatible Optionen
/L
und /R
beide angegeben
- Fehlendes Argument nach
/A:
, /F:
, /C:
, /D:
, oder/G:
- Datei angegeben von
/F:file
oder /G:file
nicht gefunden
- 255 (Fehler)
Zu durchsuchende Datenquelle (Aktualisiert basierend auf Tests mit Windows 7)
Findstr kann Daten nur aus einer der folgenden Quellen suchen:
Dateinamen, die als Argumente angegeben werden und / oder die /F:file
Option verwenden.
stdin über Umleitung findstr "searchString" <file
Datenstrom aus einer Pipe type file | findstr "searchString"
Argumente / Optionen haben Vorrang vor der Umleitung, die Vorrang vor weitergeleiteten Daten hat.
Dateinamenargumente und /F:file
können kombiniert werden. Es können mehrere Dateinamenargumente verwendet werden. Wenn mehrere /F:file
Optionen angegeben sind, wird nur die letzte verwendet. Platzhalter sind in Dateinamenargumenten zulässig, jedoch nicht in der Datei, auf die von verwiesen wird /F:file
.
Quelle der Suchzeichenfolgen (Aktualisiert basierend auf Tests mit Windows 7)
Die Optionen /G:file
und /C:string
können kombiniert werden. Es /C:string
können mehrere Optionen angegeben werden. Wenn mehrere /G:file
Optionen angegeben sind, wird nur die letzte verwendet. Wenn entweder /G:file
oder /C:string
verwendet wird, wird angenommen, dass alle Nichtoptionsargumente zu durchsuchende Dateien sind. Wenn weder /G:file
noch /C:string
verwendet wird, wird das erste Argument ohne Option als durch Leerzeichen getrennte Liste von Suchbegriffen behandelt.
Dateinamen dürfen bei Verwendung der /F:FILE
Option nicht in der Datei angegeben werden .
Dateinamen können Leerzeichen und andere Sonderzeichen enthalten. Die meisten Befehle erfordern, dass solche Dateinamen in Anführungszeichen gesetzt werden. Die /F:files.txt
Option FINDSTR erfordert jedoch, dass Dateinamen in files.txt NICHT in Anführungszeichen gesetzt werden dürfen. Die Datei wird nicht gefunden, wenn der Name in Anführungszeichen steht.
BUG - Kurze 8.3-Dateinamen können die Optionen /D
und brechen./S
Wie bei allen Windows-Befehlen versucht FINDSTR, bei der Suche nach zu durchsuchenden Dateien sowohl den langen als auch den kurzen 8.3-Namen abzugleichen. Angenommen, der aktuelle Ordner enthält die folgenden nicht leeren Dateien:
b1.txt
b.txt2
c.txt
Der folgende Befehl findet erfolgreich alle 3 Dateien:
findstr /m "^" *.txt
b.txt2
stimmt überein, weil der entsprechende Kurzname B9F64~1.TXT
übereinstimmt. Dies stimmt mit dem Verhalten aller anderen Windows-Befehle überein.
Ein Fehler mit den Optionen /D
und führt jedoch dazu /S
, dass die folgenden Befehle nur gefunden werdenb1.txt
findstr /m /d:. "^" *.txt
findstr /m /s "^" *.txt
Der Fehler verhindert, b.txt2
dass alle Dateinamen gefunden werden, nach denen b.txt2
im selben Verzeichnis sortiert wird . Zusätzliche Dateien, die zuvor sortiert wurden a.txt
, werden gefunden. Zusätzliche Dateien, die später sortiert werden d.txt
, werden übersehen, sobald der Fehler ausgelöst wurde.
Jedes durchsuchte Verzeichnis wird unabhängig behandelt. Beispielsweise /S
würde die Option erfolgreich mit der Suche in einem untergeordneten Ordner beginnen, nachdem keine Dateien im übergeordneten Ordner gefunden wurden. Sobald der Fehler jedoch dazu führt, dass ein kurzer Dateiname im untergeordneten Ordner übersehen wird, werden auch alle nachfolgenden Dateien in diesem untergeordneten Ordner übersehen .
Die Befehle funktionieren fehlerfrei, wenn auf einem Computer, auf dem die NTFS 8.3-Namensgenerierung deaktiviert ist, dieselben Dateinamen erstellt werden. Natürlich b.txt2
würde nicht gefunden werden, aber c.txt
würde richtig gefunden werden.
Nicht alle Kurznamen lösen den Fehler aus. Alle Fälle von fehlerhaftem Verhalten, die ich gesehen habe, betreffen eine Erweiterung, die länger als 3 Zeichen ist, mit einem kurzen 8.3-Namen, der genauso beginnt wie ein normaler Name, für den kein 8.3-Name erforderlich ist.
Der Fehler wurde unter XP, Vista und Windows 7 bestätigt.
Nicht druckbare Zeichen und die /P
Option
Mit dieser /P
Option überspringt FINDSTR alle Dateien, die einen der folgenden Dezimalbyte-Codes enthalten:
0-7, 14-25, 27-31.
Anders ausgedrückt, die /P
Option überspringt nur Dateien, die nicht druckbare Steuerzeichen enthalten. Steuerzeichen sind Codes kleiner oder gleich 31 (0x1F). FINDSTR behandelt die folgenden Steuerzeichen als druckbar:
8 0x08 backspace
9 0x09 horizontal tab
10 0x0A line feed
11 0x0B vertical tab
12 0x0C form feed
13 0x0D carriage return
26 0x1A substitute (end of text)
Alle anderen Steuerzeichen werden als nicht druckbar behandelt. Wenn sie vorhanden sind, kann /P
die Datei übersprungen werden.
Weitergeleitete und umgeleitete Eingabe wurde möglicherweise <CR><LF>
angehängt.
Wenn die Eingabe weitergeleitet wird und das letzte Zeichen des Streams nicht angehängt ist <LF>
, wird FINDSTR automatisch <CR><LF>
an die Eingabe angehängt . Dies wurde unter XP, Vista und Windows 7 bestätigt. (Früher dachte ich, dass die Windows-Pipe für die Änderung der Eingabe verantwortlich ist, aber seitdem habe ich festgestellt, dass FINDSTR die Änderung tatsächlich vornimmt.)
Gleiches gilt für umgeleitete Eingaben unter Vista. Wenn das letzte Zeichen einer Datei, die als umgeleitete Eingabe verwendet wird, nicht ist <LF>
, wird FINDSTR automatisch <CR><LF>
an die Eingabe angehängt . XP und Windows 7 ändern jedoch keine umgeleiteten Eingaben.
FINDSTR hängt unter XP und Windows 7, wenn die umgeleitete Eingabe nicht mit endet.<LF>
Dies ist eine unangenehme "Funktion" unter XP und Windows 7. Wenn das letzte Zeichen einer Datei, die als umgeleitete Eingabe verwendet wird, nicht mit <LF>
endet, bleibt FINDSTR auf unbestimmte Zeit hängen erreicht das Ende der umgeleiteten Datei.
Die letzte Zeile der weitergeleiteten Daten wird möglicherweise ignoriert, wenn sie aus einem einzelnen Zeichen besteht.
Wenn die Eingabe eingespeist wird und die letzte Zeile aus einem einzelnen Zeichen besteht, auf das nicht folgt <LF>
, ignoriert FINDSTR die letzte Zeile vollständig.
Beispiel - Der erste Befehl mit einem einzelnen Zeichen und nein <LF>
stimmt nicht überein, aber der zweite Befehl mit 2 Zeichen funktioniert einwandfrei, ebenso wie der dritte Befehl, der ein Zeichen mit abschließendem Zeilenumbruch enthält.
> set /p "=x" <nul | findstr "^"
> set /p "=xx" <nul | findstr "^"
xx
> echo x| findstr "^"
x
Berichtet von DosTips-Benutzer Sponge Belly bei neuem findstr-Fehler . Bestätigt unter XP, Windows 7 und Windows 8. Ich habe noch nichts von Vista gehört. (Ich muss Vista nicht mehr testen).
Optionssyntax
Optionen können entweder vorangestellt werden /
oder -
Optionen können nach einem einzelnen /
oder verkettet werden -
. Die verkettete Optionsliste kann jedoch höchstens eine Option mit mehreren Zeichen wie AUS oder F: enthalten, und die Option mit mehreren Zeichen muss die letzte Option in der Liste sein.
Im Folgenden finden Sie alle äquivalenten Möglichkeiten, um eine Regex-Suche ohne Berücksichtigung der Groß- und Kleinschreibung für eine Zeile auszudrücken, die sowohl "Hallo" als auch "Auf Wiedersehen" in beliebiger Reihenfolge enthält
/i /r /c:"hello.*goodbye" /c:"goodbye.*hello"
-i -r -c:"hello.*goodbye" /c:"goodbye.*hello"
/irc:"hello.*goodbye" /c:"goodbye.*hello"
Längenbeschränkungen für Suchzeichenfolgen
Unter Vista beträgt die maximal zulässige Länge für eine einzelne Suchzeichenfolge 511 Byte. Wenn eine FINDSTR: Search string too long.
Suchzeichenfolge 511 überschreitet, ist das Ergebnis ein Fehler mit ERRORLEVEL 2.
Bei einer Suche nach regulären Ausdrücken beträgt die maximale Länge der FINDSTR: Out of memory
Suchzeichenfolge 254. Ein regulärer Ausdruck mit einer Länge zwischen 255 und 511 führt zu einem Fehler mit ERRORLEVEL 2. Eine Länge eines regulären Ausdrucks> 511 führt zu dem FINDSTR: Search string too long.
Fehler.
Unter Windows XP ist die Länge der Suchzeichenfolge anscheinend kürzer. Findstr-Fehler: "Suchzeichenfolge zu lang": Wie wird die Teilzeichenfolge in der "for" -Schleife extrahiert und abgeglichen?
Das XP-Limit beträgt 127 Byte für Literal- und Regex-Suchen.
Zeilenlängenbeschränkungen
Dateien, die als Befehlszeilenargument oder über die Option / F: FILE angegeben wurden, haben keine bekannte Zeilenlängenbeschränkung. Die Suche wurde erfolgreich für eine 128-MB-Datei ausgeführt, die kein einziges <LF> enthielt.
Weitergeleitete Daten und umgeleitete Eingaben sind auf 8191 Byte pro Zeile begrenzt. Diese Grenze ist ein "Merkmal" von FINDSTR. Es ist nicht mit Rohren oder Umleitungen verbunden. FINDSTR, das umgeleitete stdin- oder Piped-Eingaben verwendet, stimmt niemals mit einer Zeile überein, die> = 8 KByte ist. Zeilen> = 8k erzeugen eine Fehlermeldung an stderr, aber ERRORLEVEL ist immer noch 0, wenn die Suchzeichenfolge in mindestens einer Zeile von mindestens einer Datei gefunden wird.
Standard-Suchtyp: Literal vs Regular Expression
/C:"string"
- Der Standard ist / L Literal. Das explizite Kombinieren der Option / L mit / C: "string" funktioniert zwar, ist aber redundant.
"string argument"
- Die Standardeinstellung hängt vom Inhalt der ersten Suchzeichenfolge ab. (Denken Sie daran, dass <Leerzeichen> zum Abgrenzen von Suchzeichenfolgen verwendet wird.) Wenn die erste Suchzeichenfolge ein gültiger regulärer Ausdruck ist, der mindestens ein nicht maskiertes Metazeichen enthält, werden alle Suchzeichenfolgen als reguläre Ausdrücke behandelt. Andernfalls werden alle Suchzeichenfolgen als Literale behandelt. Zum Beispiel "51.4 200"
wird als zwei reguläre Ausdrücke behandelt werden , da die erste Zeichenfolge einen nicht entgangen Punkt enthält, während "200 51.4"
als zwei Literale behandelt werden , da die erste Saite kein Meta-Zeichen enthält.
/G:file
- Die Standardeinstellung hängt vom Inhalt der ersten nicht leeren Zeile in der Datei ab. Wenn die erste Suchzeichenfolge ein gültiger regulärer Ausdruck ist, der mindestens ein nicht maskiertes Metazeichen enthält, werden alle Suchzeichenfolgen als reguläre Ausdrücke behandelt. Andernfalls werden alle Suchzeichenfolgen als Literale behandelt.
Empfehlung - Geben Sie bei Verwendung von oder immer explizit die /L
Literaloption oder die Option für /R
reguläre Ausdrücke an ."string argument"
/G:file
BUG - Die Angabe mehrerer Literal-Suchzeichenfolgen kann zu unzuverlässigen Ergebnissen führen
Das folgende einfache FINDSTR-Beispiel findet keine Übereinstimmung, obwohl dies der Fall sein sollte.
echo ffffaaa|findstr /l "ffffaaa faffaffddd"
Dieser Fehler wurde unter Windows Server 2003, Windows XP, Vista und Windows 7 bestätigt.
Basierend auf Experimenten kann FINDSTR fehlschlagen, wenn alle folgenden Bedingungen erfüllt sind:
- Bei der Suche werden mehrere Literal-Suchzeichenfolgen verwendet
- Die Suchzeichenfolgen 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
/I
Option).
Bei jedem Fehler, den ich gesehen habe, ist es immer eine der kürzeren Suchzeichenfolgen, die fehlschlägt.
Weitere Informationen finden Sie unter Warum findet dieses FINDSTR-Beispiel mit mehreren Literal-Suchzeichenfolgen keine Übereinstimmung?
Anführungszeichen und Backslahses in Befehlszeilenargumenten
Hinweis - Die Kommentare von Benutzer MC ND spiegeln die tatsächlich schrecklich komplizierten Regeln für diesen Abschnitt wider. Es gibt 3 verschiedene Analysephasen:
- Für die erste cmd.exe müssen möglicherweise einige Anführungszeichen als ^ "maskiert werden (eigentlich nichts mit FINDSTR zu tun).
- Als nächstes verwendet FINDSTR den MS C / C ++ - Argumentparser vor 2008 , der spezielle Regeln für "und \" enthält
- Nach Abschluss des Argumentparsers behandelt FINDSTR zusätzlich \ gefolgt von einem alphanumerischen Zeichen als Literal, gefolgt von einem nicht alphanumerischen Zeichen als Escapezeichen
Der Rest dieses hervorgehobenen Abschnitts ist nicht 100% korrekt. Es kann als Leitfaden für viele Situationen dienen, aber die oben genannten Regeln sind für ein umfassendes Verständnis erforderlich.
Anführungszeichen innerhalb von Befehlszeilensuchzeichenfolgen maskieren Anführungszeichen innerhalb von Befehlszeilensuchzeichenfolgen
müssen mit einem umgekehrten Schrägstrich wie maskiert werden
\"
. Dies gilt sowohl für Literal- als auch für Regex-Suchzeichenfolgen. Diese Informationen wurden unter XP, Vista und Windows 7 bestätigt.
Hinweis: Das Anführungszeichen muss möglicherweise auch für den CMD.EXE-Parser maskiert werden, dies hat jedoch nichts mit FINDSTR zu tun. Um beispielsweise nach einem einfachen Zitat zu suchen, können Sie Folgendes verwenden:
FINDSTR \^" file && echo found || echo not found
Escape-Backslash in Befehlszeilen-Literal-
Suchzeichenfolgen Backslash in einer Literal-Suchzeichenfolge kann normalerweise als
\
oder als dargestellt werden \\
. Sie sind typischerweise gleichwertig. (In Vista kann es ungewöhnliche Fälle geben, in denen der Backslash immer maskiert werden muss, aber ich habe keinen Vista-Computer mehr zum Testen) .
Es gibt jedoch einige Sonderfälle:
Bei der Suche nach aufeinanderfolgenden Backslashes müssen alle bis auf den letzten maskiert werden. Der letzte Backslash kann optional maskiert werden.
\\
kann als \\\
oder codiert werden\\\\
\\\
kann als \\\\\
oder codiert werden\\\\\\
Die Suche nach einem oder mehreren Backslashes vor einem Zitat ist bizarr. Die Logik würde vorschlagen, dass das Zitat maskiert werden muss und jeder der führenden Backslashes maskiert werden muss, aber das funktioniert nicht! Stattdessen muss jeder der führenden Backslashes doppelt maskiert werden, und das Anführungszeichen wird normalerweise maskiert:
\"
muss codiert sein als \\\\\"
\\"
muss codiert sein als \\\\\\\\\"
Wie bereits erwähnt, müssen ^
für den CMD-Parser möglicherweise auch ein oder mehrere Escape-Anführungszeichen mit Escapezeichen versehen werden
Die Informationen in diesem Abschnitt wurden unter XP und Windows 7 bestätigt.
Escaping Backslash innerhalb von Regex-Suchzeichenfolgen in der Befehlszeile
Nur Vista: Backslash in einem regulären Ausdruck muss entweder doppelt maskiert \\\\
oder einfach innerhalb eines Zeichenklassensatzes wie einfach
maskiert sein[\\]
XP und Windows 7: Backslash in einem regulären Ausdruck kann immer als dargestellt werden [\\]
. Es kann normalerweise als dargestellt werden \\
. Dies funktioniert jedoch nie, wenn der Backslash vor einem Escape-Zitat steht.
Ein oder mehrere Backslashes vor einem Escape-Zitat müssen entweder doppelt maskiert oder als codiert sein [\\]
\"
kann als \\\\\"
oder codiert werden[\\]\"
\\"
kann als \\\\\\\\\"
oder [\\][\\]\"
oder codiert sein\\[\\]\"
Escape-
Anführungszeichen und Backslash in / G: FILE-Literal-Suchzeichenfolgen Eigenständige Anführungszeichen und Backslashes in einer durch / G: -Datei angegebenen Literal-Suchzeichenfolge müssen nicht maskiert werden, können es aber sein.
"
und \"
sind gleichwertig.
\
und \\
sind gleichwertig.
Wenn die Absicht besteht, \\ zu finden, muss mindestens der führende Backslash maskiert werden. Beides \\\
und \\\\
Arbeit.
Wenn die Absicht besteht, "" zu finden, muss mindestens der führende Backslash maskiert werden. Beides \\"
und \\\"
funktionieren.
Escape-Anführungszeichen und Backslash in / G: FILE-Regex-Suchzeichenfolgen
Dies ist der einzige Fall, in dem die Escape-Sequenzen gemäß der Dokumentation wie erwartet funktionieren. Quote ist kein Regex-Metazeichen, daher muss es nicht maskiert werden (kann es aber sein). Backslash ist ein Regex-Metazeichen, daher muss es maskiert werden.
Zeichenbeschränkungen für Befehlszeilenparameter - Erweiterte ASCII-Umwandlung Das Nullzeichen (0x00) kann in keiner Zeichenfolge in der Befehlszeile angezeigt werden. Jedes andere Einzelbytezeichen kann in der Zeichenfolge erscheinen (0x01 - 0xFF). FINDSTR konvertiert jedoch viele erweiterte ASCII-Zeichen, die in Befehlszeilenparametern gefunden werden, in andere Zeichen. Dies hat zwei wesentliche Auswirkungen:
1) Viele erweiterte ASCII-Zeichen stimmen nicht überein, wenn sie als Suchzeichenfolge in der Befehlszeile verwendet werden. Diese Einschränkung gilt auch für Literal- und Regex-Suchen. Wenn eine Suchzeichenfolge erweitertes ASCII enthalten muss, /G:FILE
sollte stattdessen die Option verwendet werden.
2) FINDSTR kann möglicherweise keine Datei finden, wenn der Name erweiterte ASCII-Zeichen enthält und der Dateiname in der Befehlszeile angegeben ist. Wenn eine zu durchsuchende Datei erweitertes ASCII im Namen enthält, /F:FILE
sollte stattdessen die Option verwendet werden.
Hier finden Sie eine vollständige Liste der erweiterten ASCII-Zeichentransformationen, die FINDSTR für Befehlszeilenzeichenfolgen ausführt. Jedes Zeichen wird als Dezimalbytecodewert dargestellt. Der erste Code repräsentiert das Zeichen, wie es in der Befehlszeile angegeben ist, und der zweite Code repräsentiert das Zeichen, in das es transformiert wird. Hinweis - Diese Liste wurde auf einem US-Computer erstellt. Ich weiß nicht, welchen Einfluss andere Sprachen auf diese Liste haben könnten.
158 treated as 080 199 treated as 221 226 treated as 071
169 treated as 170 200 treated as 043 227 treated as 112
176 treated as 221 201 treated as 043 228 treated as 083
177 treated as 221 202 treated as 045 229 treated as 115
178 treated as 221 203 treated as 045 231 treated as 116
179 treated as 221 204 treated as 221 232 treated as 070
180 treated as 221 205 treated as 045 233 treated as 084
181 treated as 221 206 treated as 043 234 treated as 079
182 treated as 221 207 treated as 045 235 treated as 100
183 treated as 043 208 treated as 045 236 treated as 056
184 treated as 043 209 treated as 045 237 treated as 102
185 treated as 221 210 treated as 045 238 treated as 101
186 treated as 221 211 treated as 043 239 treated as 110
187 treated as 043 212 treated as 043 240 treated as 061
188 treated as 043 213 treated as 043 242 treated as 061
189 treated as 043 214 treated as 043 243 treated as 061
190 treated as 043 215 treated as 043 244 treated as 040
191 treated as 043 216 treated as 043 245 treated as 041
192 treated as 043 217 treated as 043 247 treated as 126
193 treated as 045 218 treated as 043 249 treated as 250
194 treated as 045 219 treated as 221 251 treated as 118
195 treated as 043 220 treated as 095 252 treated as 110
196 treated as 045 222 treated as 221 254 treated as 221
197 treated as 043 223 treated as 095
198 treated as 221 224 treated as 097
Jedes Zeichen> 0, das nicht in der obigen Liste enthalten ist, wird als sich selbst behandelt, einschließlich <CR>
und < LF>
. Der einfachste Weg, ungerade Zeichen wie <CR>
und einzuschließen, <LF>
besteht darin, sie in eine Umgebungsvariable zu integrieren und eine verzögerte Erweiterung innerhalb des Befehlszeilenarguments zu verwenden.
Zeichenbeschränkungen für Zeichenfolgen, die in Dateien gefunden werden, die durch die Optionen / G: FILE und / F: FILE angegeben sind.
Das Zeichen nul (0x00) kann in der Datei angezeigt werden, funktioniert jedoch wie der C-Zeichenfolgenabschluss. Alle Zeichen nach einem Nullzeichen werden als eine andere Zeichenfolge behandelt, als wären sie in einer anderen Zeile.
Die Zeichen <CR>
und <LF>
werden als Zeilenabschlusszeichen behandelt, die eine Zeichenfolge beenden, und sind nicht in der Zeichenfolge enthalten.
Alle anderen Einzelbytezeichen sind perfekt in einer Zeichenfolge enthalten.
Durchsuchen von Unicode-Dateien FINDSTR kann die meisten Unicode-Dateien
(UTF-16, UTF-16LE, UTF-16BE, UTF-32) nicht ordnungsgemäß durchsuchen, da es nicht nach Null-Bytes suchen kann und Unicode normalerweise viele Null-Bytes enthält.
Der Befehl TYPE konvertiert jedoch UTF-16LE mit Stückliste in einen Einzelbyte-Zeichensatz, sodass ein Befehl wie der folgende mit UTF-16LE mit Stückliste funktioniert.
type unicode.txt|findstr "search"
Beachten Sie, dass Unicode-Codepunkte, die von Ihrer aktiven Codepage nicht unterstützt werden, in ?
Zeichen konvertiert werden .
Es ist möglich, UTF-8 zu durchsuchen, solange Ihre Suchzeichenfolge nur ASCII enthält. Die Konsolenausgabe von Multi-Byte-UTF-8-Zeichen ist jedoch nicht korrekt. Wenn Sie die Ausgabe jedoch in eine Datei umleiten, wird das Ergebnis korrekt in UTF-8 codiert. Beachten Sie, dass wenn die UTF-8-Datei eine Stückliste enthält, die Stückliste als Teil der ersten Zeile betrachtet wird, wodurch eine Suche ausgelöst werden kann, die dem Zeilenanfang entspricht.
Es ist möglich, Multi-Byte-UTF-8-Zeichen zu durchsuchen, wenn Sie Ihre Suchzeichenfolge in eine UTF-8-codierte Suchdatei (ohne Stückliste) einfügen und die Option / G verwenden.
End Of Line
FINDSTR bricht Zeilen unmittelbar nach jedem <LF>. Das Vorhandensein oder Fehlen von <CR> hat keinen Einfluss auf Zeilenumbrüche.
Suchen über Zeilenumbrüche
Wie erwartet .
stimmt das Regex-Metazeichen nicht mit <CR> oder <LF> überein. Es ist jedoch möglich, mithilfe einer Befehlszeilensuchzeichenfolge über einen Zeilenumbruch hinweg zu suchen. Sowohl die Zeichen <CR> als auch <LF> müssen explizit übereinstimmen. Wenn eine mehrzeilige Übereinstimmung gefunden wird, wird nur die erste Zeile der Übereinstimmung gedruckt. FINDSTR kehrt dann zur zweiten Zeile in der Quelle zurück und beginnt die Suche erneut - eine Art Feature vom Typ "Vorausschau".
Angenommen, TEXT.TXT enthält diese Inhalte (könnte Unix- oder Windows-Stil sein).
A
A
A
B
A
A
Dann dieses Skript
@echo off
setlocal
::Define LF variable containing a linefeed (0x0A)
set LF=^
::Above 2 blank lines are critical - do not remove
::Define CR variable containing a carriage return (0x0D)
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
setlocal enableDelayedExpansion
::regex "!CR!*!LF!" will match both Unix and Windows style End-Of-Line
findstr /n /r /c:"A!CR!*!LF!A" TEST.TXT
gibt diese Ergebnisse
1:A
2:A
5:A
Das Durchsuchen von Zeilenumbrüchen mit der Option / G: FILE ist ungenau, da <CR> oder <LF> nur über einen Ausdrucksbereich für Regex-Zeichenklassen abgeglichen werden können, der die EOL-Zeichen enthält.
[<TAB>-<0x0B>]
stimmt mit <LF> überein, stimmt aber auch mit <TAB> und <0x0B> überein
[<0x0C>-!]
stimmt mit <CR> überein, aber es stimmt auch mit <0x0C> und überein!
Hinweis - Die obigen Angaben sind symbolische Darstellungen des Regex-Byte-Streams, da ich die Zeichen nicht grafisch darstellen kann.
Antwort weiter in Teil 2 unten ...
grep
die sich sehr gut verstanden und dokumentiert :-) Siehe stackoverflow.com/questions/2635740/... zum Beispiel.