Get-Content 拆分但保持前导零并仅按 powershell 中的第一个 '_' 拆分

Get-Content splitting but keep leading zeros and split only by first '_' in powershell

我有一些像这样的 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

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

.Split($separator, $count)限制拆分次数,然后制作自己的输出对象:

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

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

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

另一种 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 "^([^_]+)_(.*) *$" 还会从您发布的示例行中删除尾随空格。

向您展示了如何使用 .Split() 方法执行基于分隔符的拆分,该拆分限制了标记 returned 的数量,在他的解决方案中,它仅按 第1_个实例,到return一共2个代币。

顺便说一句:您还可以使用 PowerShell 自己的 -split operator,其使用 :

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

就是说,您后来的评论表明您可能希望简单地从输入字符串中删除 2nd _ 实例之后的所有内容。

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

请注意如何将 $null 指定为变量以接收有效的第 3 个令牌 丢弃 该令牌,因为我们对此不感兴趣。

要用 _ 重新连接生成的 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