2015-02-24 42 views
0

我试图从PS脚本加载文件,需要根据给定模式和新值进行搜索替换。我需要知道模式是什么。下面是该文件的节选:使用PowerShell进行搜索替换所需的RegEx

USER_IDEN;SYSTEM1;USERNAME1; 
30;WINDOWS;Wanner.Siegfried; 
63;WINDOWS;Ott.Rudolf; 
68;WINDOWS;Waldera.Alicja; 
94;WINDOWS;Lanzl.Dieter; 
98;WINDOWS;Hofmeier.Erhard; 

ReplacerValue: “@ dummy.domain.com” 要更换什么:USERNAME1列

预期结果:

USER_IDEN;SYSTEM1;USERNAME1; 
30;WINDOWS;[email protected]; 
63;WINDOWS;[email protected]; 
68;WINDOWS;[email protected]; 
94;WINDOWS;[email protected]; 
98;WINDOWS;[email protected]; 

此外,文件也可以是这样的:

USER_IDEN;SYSTEM1;USERNAME1;SYSTEM2;USERNAME2;SYSTEM3;USERNAME3; 
30;WINDOWS;Wanner.Siegfried;WINDOWS2;Wanner.Siegfried;LINUX;Dev-1;LINUX2;QA1 
63;WINDOWS;Ott.Rudolf;WINDOWS2;Ott.Rudolf;LINUX;Dev-2 
68;WINDOWS;Waldera.Alicja; 
94;WINDOWS;Lanzl.Dieter;WINDOWS4;Lanzl.Dieter;WINDOWS3;Lead1 
98;WINDOWS;Hofmeier.Erhard; 

在上面的例子中,我想请在USERNAME n列中查找值,但列行可能不存在,但CSV(;)和对将保持不变,并且第一个值也是标识符,因此它始终存在。

我发现的方式开始,但需要获得模式:

(Get-Content C:\script\test.txt) | 
Foreach-Object {$_ -replace "^([0-9]+;WINDOWS;[^;]+);$", '[email protected];'} | 
Set-Content C:\script\test.txt 

编辑 我想出了这个模式:^([0-9]+;WINDOWS;[^;]+);$ 这是非常固定在某个特定的文件只能用没有多个Domain-Username对,并且不依赖于列。

+1

你应该看看使用'Import-Csv'来做到这一点。只需使用';'作为分隔符。 – arco444 2015-02-24 11:23:41

回答

2

我认为使用正则表达式来做到这一点是困难的。而不是使用Get-Content使用Import-Csv,它会为你分割你的列。然后,您可以使用Get-Memeber来识别USERNAME列。类似这样的:

$x = Import-Csv YourFile.csv -Delimiter ';' 
$f = @($x[0] | Get-Member -MemberType NoteProperty | Select name -ExpandProperty name | ? {$_ -match 'USERNAME'}) 
$f | % { 
    $n = $_ 
    $x | % {$_."$n" = $_."$n" + '@dummy.domain.com'} 
} 
$x | Export-Csv .\YourFile.csv -Delimiter ';' -NoTypeInformation