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