使用PowerShell拆分字符串并对每个标记执行某些操作

Pie*_*ler 54 string powershell tokenize

我想在空格上拆分管道的每一行,然后在自己的行上打印每个令牌.

我意识到我可以使用以下方法获得此结果:

(cat someFileInsteadOfAPipe).split(" ")
Run Code Online (Sandbox Code Playgroud)

但我想要更多的灵活性.我希望能够对每个令牌做任何事情.(我曾经在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"}
Run Code Online (Sandbox Code Playgroud)

显然,它只打印第一个令牌.有没有办法让我在每个令牌上依次打印?

此外,%{$data = $_.split(" "); Write-Output "$($data[0])"}我从博客获得的部分,我真的不明白我在做什么或语法是如何工作的.

我想谷歌,但我不知道该怎么称呼它.请帮我一两句话给谷歌,或者链接向我解释这些%和所有$符号的作用,以及开始和结束括号的重要性.

我意识到我实际上无法使用(cat someFileInsteadOfAPipe).split(" "),因为文件(或更好的传入管道)包含多行.

关于一些答案:

如果Select-String在令牌化之前用于过滤输出,则需要记住Select-String命令的输出不是字符串的集合,而是MatchInfo对象的集合.要获取要拆分的字符串,需要访问对象的Line属性MatchInfo,如下所示:

cat someFile | Select-String "keywordFoo" | %{$_.Line.Split(" ")}
Run Code Online (Sandbox Code Playgroud)

Jus*_*ane 114

"Once upon a time there were three little pigs".Split(" ") | ForEach {
    "$_ is a token"
 }
Run Code Online (Sandbox Code Playgroud)

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

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

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

$_.Split(" ")获取当前变量并将其拆分为空格.当前变量将是当前循环的任何内容ForEach.

  • 请注意:从PowerShell v2开始,有一个`-split`操作符,可用于分割空格(`-split $ foo`)或类似于`.Split('')`:`$ foo - 分裂''`. (13认同)
  • aaaah,谢谢你的编辑.知道'%`是`foreach-object`的缩写,意味着我可以为多行执行此操作:`cat.\ tmp.txt | %{$ _.分裂("")} | %{Write-Output"$($ _)hello"}`问题解决了. (3认同)
  • 完善!很高兴我能帮助你.命令的最后一部分实际上可能只是"$ _ hello"`.如果您尝试在字符串中扩展对象属性的值,则只需使用$($ variable)表示法.例如`"我的姓氏是$($ person.surname)."`或者cmdlet方法的输出:`"明天的日期是$((获取日期).AddDays(1))"`. (2认同)