分割字符串使用PowerShell,做一些与每个令牌(Split string with Power

2019-06-26 01:40发布

我想拆就空间管的每一行,然后打印上自己的行每个令牌。

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

(cat someFileInsteadOfAPipe).split(" ")

但我想更多的灵活性。 我希望能够做到这与每个令牌什么。 (我用AWK在Unix上,而我试图让相同的功能。)

我目前有:

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])"}部分我从一个博客了,我真不明白我在做什么或语法是如何工作的。

我想谷歌,但我不知道该怎么称呼它。 请帮我出一两句话给谷歌,或链接给我解释一下% ,所有的$符号做,以及开放的意义和右括号。

我知道我不能实际使用(cat someFileInsteadOfAPipe).split(" ")因为文件(或最好进入管线)包含一个以上的线。

对于一些问题的答案:

如果您使用的Select-String过滤符号化前的输出,你需要记住的是,输出Select-String命令不是字符串的集合,而是集合MatchInfo对象。 为了得到你要拆分的字符串,你需要访问Line的财产MatchInfo对象,就像这样:

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

Answer 1:

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

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

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

%是一个别名ForEach-Object 。 任何包围的括号内是为每个收到的对象运行一次。 在这种情况下,它只能运行一次,因为你在发送一个字符串。

$_.Split(" ")正在当前变量和空间分割它。 目前的变量将任何当前正在被挂绕ForEach



Answer 2:

为了补充贾斯特斯领主的有用的答案 :

  • 至于乔伊的评论指出,PowerShell提供了一个强大的,基于正则表达式, -split 操作

    • 在它的一元形式( -split '...' ), -split行为就像awk的默认场分裂 ,这意味着:
      • 开头和结尾的空白将被忽略。
      • 任何空白(例如, 多个相邻空间)的运行被视为一个单个隔膜。
  • PowerShellv4的基于表达式的-并且因此更快- 替代ForEach-Object 小命令变得可用:所述.ForEach()收集“操作员”(方法),如在这个博客帖子 (沿着.Where()方法,更强大的,基于表达式的替代Where-Object )。

下面是基于这些功能的解决方案:

PS> (-split '   One      for the money   ').ForEach({ "token: [$_]" })
token: [One]
token: [for]
token: [the]
token: [money]

需要注意的是开头和结尾的空白将被忽略,而之间的多个空格One ,并for被视为一个单一的分隔符。



Answer 3:

做到这一点的另一种方式是贾斯特斯领主的和mklement0的回答的组合。 它没有意义的,做这种方式,当你看一个衬垫例子,但是当你试图大规模编辑文件或文件名一堆的它有非常方便:

$test = '   One      for the money   '
$option = [System.StringSplitOptions]::RemoveEmptyEntries
$($test.split(' ',$option)).foreach{$_}

这会出来为:

One
for
the
money


文章来源: Split string with PowerShell and do something with each token