使用PowerShell分割string,并对每个令牌执行一些操作
我想在空间上分割pipe道的每一行,然后在自己的行上打印每个标记。
我意识到我可以使用这个结果:
(cat someFileInsteadOfAPipe).split(" ")
但是我想要更多的灵活性。 我希望能够对每个令牌做任何事情。 (我曾经在Unix上使用AWK ,并且试图获得相同的function。)
我目前有:
echo "Once upon a time there were three little pigs" | %{$data = $_.split(" "); Write-Output "$($data[0]) and whatever I want to output with it"}
这显然只打印第一个标记。 是否有一种方法可以让我为每一个令牌分别打印?
另外, %{$data = $_.split(" "); Write-Output "$($data[0])"}
%{$data = $_.split(" "); Write-Output "$($data[0])"}
部分我从一个博客,我真的不明白我在做什么或如何的语法工作。
我想谷歌,但我不知道该怎么称呼它。 请给我一两个字给Google,或者给我一个链接,向我解释%
和所有$
符号的作用,以及开始和结束括号的意义。
我意识到我实际上不能使用(cat someFileInsteadOfAPipe).split(" ")
,因为文件(或更好的传入pipe道)包含多行。
关于一些答案:
如果在标记化之前使用Select-String
过滤输出,则需要记住, Select-String
命令的输出不是string的集合,而是MatchInfo
对象的集合。 要获得想要分割的string,需要访问MatchInfo
对象的Line
属性,如下所示:
cat someFile | Select-String "keywordFoo" | %{$_.Line.Split(" ")}
"Once upon a time there were three little pigs".Split(" ") | ForEach { Write-Host "$_ is a token" }
关键是$_
,它代表pipe道中的当前variables。
关于您在网上find的代码:
%
是ForEach-Object
的别名。 对于每个收到的对象,括号中的任何内容都会运行一次。 在这种情况下,它只运行一次,因为你发送一个string。
$_.Split(" ")
取当前variables并将其分开。 当前variables将是ForEach
当前正在循环的任何variables。