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

时间:2012-07-05 16:20:17

标签: string powershell tokenize

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

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

(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

4 个答案:

答案 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