2012-07-05 57 views
50

我想将空间上的管道的每一行分开,然后在各自的行上打印每个令牌。使用PowerShell拆分字符串并对每个令牌执行一些操作

我意识到,我可以用得到这样的结果:

(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命令的输出不是字符串的集合,而是一个集合MatchInfo对象。为了得到你要拆分的字符串,你需要访问MatchInfo对象的Line财产,像这样:

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

回答

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

的关键是$_,它代表在管道中的当前变量。

关于你在网上找到的代码:

%ForEach-Object的别名。对于收到的每个对象,括号内的任何内容都会运行一次。在这种情况下,它只会运行一次,因为您正在发送一个字符串。

$_.Split(" ")正在取出当前变量并将其拆分为空格。目前的变量将是ForEach当前正在循环的任何变量。

+1

aaaah,感谢您的编辑。知道'%'是'foreach-object'的缩写,意味着我可以对多行​​进行操作:'cat。\ tmp.txt | %{$ _。Split(“”)} | %{Write-Output“$($ _)hello”}'问题解决了。 – 2012-07-05 16:47:48

+2

完美!很高兴我能帮上忙。你的命令的最后一部分实际上可能只是''__ hello“'。如果您试图扩展字符串内对象属性的值,则只需使用$($ variable)表示法。例如''我的姓氏是$($ person.surname)。“或者cmdlet方法的输出:'”明天的日期是$((Get-Date).AddDays(1))“'。 – 2012-07-05 17:03:04

+11

请注意:从PowerShell v2开始,有一个'-split'运算符可以用来分割一般的空白('-split $ foo')或类似于''。分割('')':'$ foo -split'''。 – Joey 2012-07-06 07:59:12

相关问题