获取内容拆分,但保持前导零并且仅在Powershell中按第一个'_'拆分

时间:2018-11-22 14:26:56

标签: powershell text-parsing

我有一些这样的txt数据:

0.0.0.1_03_1          
0.0.0.1_03            
0.0.0.1_02_2_1_3_4          
0.0.0.1_02_1          
0.0.0.1_02            
0.0.0.1_01_1          
0.0.0.1_01  

我要实现的是将两个变量分开(0.0.0.1和其余变量) 我只想除以第一个'_'并保留前导零(例如01) 我在做这样的事:

Get-Content $SourceTxtDbFile | 
  ConvertFrom-String -Delimiter "_" -PropertyNames DbVersion, ScriptNumber

但是结果既没有前导零,也没有按照我希望的方式分割线。

3 个答案:

答案 0 :(得分:6)

使用.Split($separator, $count)限制拆分数量,然后创建自己的输出对象:

Get-Content D:\test.txt | ForEach-Object {

    $Left, $Right = $_.split('_', 2)

    [PsCustomObject]@{ 
        DbVersion    = $Left.Trim()
        ScriptNumber = $Right.Trim()
    } 
}

答案 1 :(得分:1)

TessellatingHeckler's helpful answer向您展示如何使用.Split()方法执行基于分隔符的拆分,以限制返回的令牌数,在他的解决方案中,令牌仅拆分 1st _实例,总共返回 2 个令牌。

顺便说一句:您还可以使用PowerShell自己的-split 运算符,其使用does have its advantages

$_ -split '_', 2 # in this case, same as: $_.split('_', 2) 

也就是说,您以后的评论建议您可能只是想从输入字符串中删除 2nd _实例之后的所有内容。

$dbVersion, $scriptNumber, $null  = $_ -split '_', 3 # -> e.g., '0.0.0.1', 03', '1'

请注意,如果我们对它不感兴趣,如何将$null指定为变量以接收第三个令牌,从而有效地丢弃该令牌。

要使用_重新加入生成的2个令牌,使用-join运算符最简单:

$dbVersion, $scriptNumber -join '_'

将它们放在一起:

# Sample array of input lines.
$lines=@'
0.0.0.1_03_1
0.0.0.1_03
0.0.0.1_02_2_1_3_4
0.0.0.1_02_1
0.0.0.1_02
0.0.0.1_01_1
0.0.0.1_01
'@ -split '\r?\n'

# Use Get-Content $SourceTxtDbFile instead of $lines in the real world.
$lines | ForEach-Object {
  # Split by the first two "_" and save the first two tokens.      
  $dbVersion, $scriptNumber, $null = $_ -split '_', 3
  # Re-join the first two tokens with '_'and output the result.
  $dbVersion, $scriptNumber -join '_'
}

使用示例输入,将产生:

0.0.0.1_03
0.0.0.1_03
0.0.0.1_02
0.0.0.1_02
0.0.0.1_02
0.0.0.1_01
0.0.0.1_01

答案 2 :(得分:0)

另一种RegEx方法:

> gc .\file.txt|?{$_ -match "^([^_]+)_(.*) *$"}|%{[PSCustomObject]@{DBVersion=$Matches[1];ScriptNumber=$Matches[2]}}

DBVersion ScriptNumber
--------- ------------
0.0.0.1   03_1
0.0.0.1   03
0.0.0.1   02_2_1_3_4
0.0.0.1   02_1
0.0.0.1   02
0.0.0.1   01_1
0.0.0.1   01

没有别名的情况相同

Get-Content .\file.txt|
  Where-Object {$_ -match"^([^_]+)_(.*) *$"} | 
    ForEach-Object {
      [PSCustomObject]@{
        DBVersion   = $Matches[1]
        ScriptNumber= $Matches[2]
      }
    }

RegEx "^([^_]+)_(.*) *$"还会从发布的示例行中删除尾随空格。