我想在空格上拆分管道的每一行,然后在各自的行上打印每个令牌。
我意识到我可以使用以下方式获得此结果:
(cat someFileInsteadOfAPipe).split(" ")
但我想要更多的灵活性。我希望能够对每个令牌做任何事情。 (我以前在Unix上使用AWK,我试图获得相同的功能。)
我目前有:
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])"}
部分,我真的不明白我在做什么或语法如何运作。
我想谷歌,但我不知道该怎么称呼它。请一两句话给Google帮我,或者一个链接向我解释%
和所有$
符号的作用,以及开始和结束括号的重要性。
我意识到我实际上无法使用(cat someFileInsteadOfAPipe).split(" ")
,因为文件(或更好的传入管道)包含多行。
关于一些答案:
如果在令牌化之前使用Select-String
过滤输出,则需要记住Select-String
命令的输出不是字符串的集合,而是{{1的集合对象。要获取要拆分的字符串,需要访问MatchInfo
对象的Line
属性,如下所示:
MatchInfo
答案 0 :(得分:106)
"Once upon a time there were three little pigs".Split(" ") | ForEach {
"$_ is a token"
}
键是$_
,它代表管道中的当前变量。
关于您在网上找到的代码:
%
是ForEach-Object
的别名。括号内的任何内容都会针对它接收的每个对象运行一次。在这种情况下,它只运行一次,因为你发送的是一个字符串。
$_.Split(" ")
正在获取当前变量并将其拆分为空格。当前变量将是ForEach
当前正在循环的任何内容。
答案 1 :(得分:1)
-split输出一个数组,您可以将其保存到这样的变量中:
Int
另一件可爱的事,您可以在赋值语句的两边都有数组:
$a = -split 'Once upon a time'
$a[0]
Once
答案 2 :(得分:0)
补充Justus Thane's helpful answer:
在评论中注明Joey时,PowerShell具有功能强大的基于正则表达式的-split
operator。
Connection to the remote host failed : connection timed out: api.central.ballerina.io/35.227.97.45:443
)中,JAVA_OPTS
的行为类似于-split '...'
的默认字段拆分,意思就是:
在 PowerShell v4 中,基于表达式 - 因此更快 - 替代-split
cmdlet 变得可用:{{ 1}}集合"运算符" (方法),如this blog post中所述(与awk
方法一起,是ForEach-Object
)更强大,基于表达式的替代方法。
以下是基于这些功能的解决方案:
.ForEach()
请注意,前导空格和尾随空格被忽略,.Where()
和Where-Object
之间的多个空格被视为单个分隔符。
答案 3 :(得分:0)
实现此目的的另一种方法是Justus Thane和mklement0的答案的组合。当您查看一个衬纸示例时,以这种方式这样做是没有意义的,但是当您尝试批量编辑一个文件或一堆文件名时,它非常方便:
$test = ' One for the money '
$option = [System.StringSplitOptions]::RemoveEmptyEntries
$($test.split(' ',$option)).foreach{$_}
结果将显示为:
One
for
the
money