71 votes

Fractionner la chaîne avec powershell et faire quelque chose avec chaque jeton

Je veux diviser chaque ligne d'un tuyau sur des espaces, puis imprimer chaque jeton sur sa propre ligne.

Je me rends compte que je peux obtenir ce résultat à l'aide de:

(cat someFileInsteadOfAPipe).split(" ")

Mais j'en veux plus de souplesse, je veux être capable de faire à peu près n'importe quoi avec chaque jeton. (J'ai l'habitude d'utiliser awk sur Unix et je vais essayer d'obtenir les mêmes fonctionnalités).

Ce que j'ai actuellement est:

echo "Once upon a time there were three little pigs" | %{$data = $_.split(" "); Write-Output "$($data[0]) and whatever I want to output with it"}

Ce qui, évidemment, n'imprime que le premier jeton. Est-il un moyen pour moi de for-each sur les jetons, l'impression de chaque tour?

Aussi, l' %{$data = $_.split(" "); Write-Output "$($data[0])"} part je l'ai eu à partir d'un blog, et je ne comprends vraiment pas ce que je fais, ni comment la syntaxe fonctionne. Je veux google pour elle, mais je ne sais pas comment l'appeler. S'il vous plaît aidez-moi avec un mot ou deux à google, ou un lien à m'expliquer ce que l' % et tous les $ symboles, ainsi que l'importance de l'ouverture et de la fermeture de parenthèses.

Mise à JOUR:

Je viens de réaliser que je ne peux pas vraiment utiliser (cat someFileInsteadOfAPipe).split(" "), depuis le fichier (ou préférable canal entrant) contient plus d'une ligne.

Mise à JOUR 2

Juste une chose que j'ai compris lors de l'utilisation de la accepté de répondre ci-dessous, ce qui pourrait aider les autres à la lecture de ce.

Si vous utilisez Select-String pour filtrer la sortie avant de segmentation, vous devez garder à l'esprit que la sortie de l' Select-String commande n'est pas une collection de chaînes de caractères, mais une collection d' MatchInfo objets. Pour obtenir de la chaîne que vous voulez partager, vous devez accéder à l' Line de la propriété de l' MatchInfo objet, comme suit:

cat someFile | Select-String "keywordFoo" | %{$_.Line.Split(" ")}

153voto

Justus Thane Points 669

Est-ce cela que vous cherchez?

"Once upon a time there were three little pigs".Split(" ") | ForEach {
    Write-Host "$_ is a token"
 }

La clé est de $_, qui se tient pour la variable courante dans le pipeline.

Edit: Pour répondre à vos questions sur le code que vous avez trouvé en ligne:

% est un alias pour le ForEach-Object. Rien enfermés à l'intérieur des parenthèses est exécuté une fois pour chaque objet qu'il reçoit. Dans ce cas, il fonctionne seulement une fois, parce que vous êtes à l'envoi d'une chaîne unique.

$_.Split(" ") est la variable courante et le fractionnement sur des espaces. La variable courante sera tout ce qui est actuellement en boucle sur par ForEach.

L'espoir qui fait sens.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X