findstr de commande de Windows expression régulière
Est-il un moyen de recherche de 2 ou plusieurs espaces dans une ligne entre les lettres, à l'aide de findstr
à partir de la ligne de commande de Windows?
Exemple:
Hello world! - nomatch wanted
Hello world! - match wanted
Quelle est la syntaxe d'expression régulière?
Aussi, pouvez-vous svp m'aider à comprendre la ligne de commande suivante session (différence entre [ ]
et [ ]*
; la deuxième commande ne renvoie rien):
c:>findstr -i -r "view[ ]*data.sub" "view data sub.acf"
View Data Sub.ACF: "].DATE_STAMP)>=[Forms]![MainNav]![View Data Sub]"
View Data Sub.ACF: "].DATE_STAMP)<[Forms]![MainNav]![View Data Sub]"
c:>findstr -i -r "view[ ]data.sub" "view data sub.acf"
c:>
PS: Juste par curiosité; je sais à propos de awk, perl, C#, etc, mais qu'en est findstr
?
Vous devez vous connecter pour publier un commentaire.
Si vous voulez juste trouver deux espaces consécutifs:
Ou dans une casse expression régulière:
L'important est la
/C:
devant le motif. Cela ditfindstr
pour traiter le motif comme une chaîne littérale. Sans elle, findstr divise le modèle en plusieurs modèles à des espaces. Qui, dans mon expérience, n'est jamais ce que vous voulez.Mise à jour
De faire deux ou plusieurs espaces entre les lettres:
Remarque qu'il y a trois espaces dans le motif. Cela correspond à une lettre, deux espaces de suivi par zéro ou plusieurs espaces (c'est à dire deux espaces ou plus) et une autre lettre.
findstr
assez bien. Ce que je ne sais pas si un truc n'existe pour l'utiliser pour un problème que je viens de décrire. (À mon humble avis, au lieu d'utiliser "c:" de l'interrupteur, on peut toujours utiliser de simples ancienfind
, pasfindstr
)[a-z]
correspond à toutes les supérieures et inférieures de caractères alpha (y compris les non-anglais diacriticals), sauf pour lesZ
, même si la recherche est sensible à la casse. Un équivalent de recherche sans le/I
option seraitfindstr /R /C:"[a-zZ] *[a-zZ]" input.txt
. Voir la section intitulée "Regex classe de personnage intervalle [x-y]" près du bas de la stackoverflow.com/a/8844873/1012053 pour plus d'info.De trouver deux espaces consécutifs ou plus entre les lettres:
Traduction: match lignes contenant 'o', deux espaces, zéro, un ou plusieurs espaces, 'w'. (Les crochets sont redondants, mais ajouter plus de clarté.) Sans doute, vous savez déjà que
findstr /?
vous donnera un résumé de la syntaxe d'expression régulière?Comme pour la deuxième partie de votre question: comme arx l'a déjà souligné, la raison pour laquelle vous n'obtenez pas les résultats que vous attendez, c'est que vous n'êtes pas à l'aide de l' /C du pavillon. Tenir compte de votre première commande:
Ceci est interprété comme une recherche de n'importe quelle ligne correspondant, soit de deux expressions régulières,
view[
et]*data.sub
. J'ai fait quelques expériences, et je crois que la première regex est soit d'être jetés comme mal formé, ou interprété comme exigeant qu'un match à partir d'un ensemble vide de caractères. La deuxième regex est interprété comme suit: zéro, un ou plusieurs ']', 'données', un caractère arbitraire, 'sous'. Comme il arrive, cela arrive à suivre les mêmes lignes que la seule expression régulière que vous pensiez à l'aide. Pas, donc quand vous emportez la astérisque:Maintenant la deuxième regex est interprété comme suit: exactement un ']', 'données', un caractère arbitraire, 'sous'. Depuis la chaîne de caractères"] données' ne se produit pas dans votre texte, aucune des lignes de match. Au lieu de cela, vous devez spécifier /c:
Maintenant, vous êtes à la recherche d'une seule regex: "view", un espace, "data", un caractère arbitraire, 'sous'. C'est sans doute ce que tu voulais faire.
findstr /?
de sortie de la commande: "/C:string Uses specified string as a **literal** search string.
"?findstr
interprétation des espaces. "C:" switch est plus utile que ce que je pensais, que ce soit ce qu'description moyen. Je suis impressionné par stackoverflow.com!/C:"search"
n'a jamais dérogé à la des espaces, il est interpretted comme une chaîne de caractères par défaut. Elle peut être interprétée comme l'expression régulière si le/R
option est spécifiée. Cela contraste avec"search"
passé comme un argument simple. Il est divisé à chaque espace dans plusieurs chaînes de recherche et chaque chaîne peut être interprété comme un littéral ou une expression régulière, en fonction du contenu de la première chaîne. Voir la section intitulée "par Défaut type de recherche: Littéral vs Expression Régulière" dans le stackoverflow.com/a/8844873/1012053 pour plus d'info.