2015-02-24 77 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