Scinde une 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 en l'utilisant:
(cat someFileInsteadOfAPipe).split(" ")
Mais j'en veux plus de flexibilité. 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.)
J'ai actuellement:
echo "Once upon a time there were three little pigs" | %{$data = $_.split(" "); Write-Output "$($data[0]) and whatever I want to output with it"}
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, le %{$data = $_.split(" "); Write-Output "$($data[0])"}
partie que j'ai obtenu à 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 le %
et tous les $
de symboles, ainsi que l'importance de l'ouverture et de la fermeture de parenthèses.
Je me rends compte que je ne peux pas vraiment utiliser (cat someFileInsteadOfAPipe).split(" ")
, depuis le fichier (ou préférable canal entrant) contient plus d'une ligne.
À l'égard de certaines réponses:
Si vous utilisez Select-String
pour filtrer la sortie avant de segmentation, vous devez garder à l'esprit que la sortie de la Select-String
commande n'est pas une collection de chaînes de caractères, mais une collection de MatchInfo
objets. Pour obtenir de la chaîne que vous voulez partager, vous devez accéder à la Line
propriété de la MatchInfo
objet, comme suit:
cat someFile | Select-String "keywordFoo" | %{$_.Line.Split(" ")}
Vous devez vous connecter pour publier un commentaire.
La clé est
$_
, qui se tient pour la variable courante dans le pipeline.Sur le code que vous avez trouvé en ligne:
%
est un alias pourForEach-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 de prendre la variable courante et le fractionnement sur des espaces. La variable courante sera tout ce qui est actuellement en boucle sur parForEach
.%
est court pourforeach-object
signifie que je peux faire cela pour de multiples lignes:cat .\tmp.txt | %{$_.Split(" ")} | %{Write-Output "$($_) hello"}
le Problème est résolu."$_ hello"
. Vous avez seulement besoin d'utiliser le $($variable) notation si vous êtes en essayant de développer la valeur des propriétés d'un objet à l'intérieur d'une chaîne. Par exemple"My last name is $($person.surname)."
Ou de la sortie d'une applet de commande de la méthode:"Tomorrow's date is $((Get-Date).AddDays(1))"
.-split
de l'opérateur qui peuvent être utilisés pour diviser sur des espaces en général (-split $foo
) ou analogue à.Split(' ')
:$foo -split ' '
.Pour compléter Justus Thane de réponse utile:
Comme Joey notes dans un commentaire, PowerShell est un puissant, regex basé
split
operator.-split '...'
),-split
se comporte commeawk
's de champ par défaut fractionnement, ce qui signifie que:Dans PowerShell v4 une basée sur une expression - et donc plus rapide - alternative à la
ForEach-Object
applet de commande est devenu disponible: le.ForEach()
collection "opérateur" (méthode), comme décrit dans ce blog (à côté de la.Where()
méthode, plus puissante, basée sur une expression alternative àWhere-Object
).Voici une solution sur la base de ces caractéristiques:
Noter que l'attaque et de fuite des espaces a été ignoré, et que les espaces multiples entre
One
etfor
ont été traités comme un seul séparateur.Une autre façon d'accomplir ceci est une combinaison de Justus Thane et mklement0 réponses. Il n'est pas judicieux de faire de cette façon, lorsque vous regardez un un liner exemple, mais quand vous êtes à essayer de masse pour modifier un fichier ou un groupe de noms de fichiers il s'agit en pratique:
Ce va sortir comme: