PowerShell - 打开文件,在一行中查找字符串并替换上一行中的字符串

时间:2015-06-25 08:08:14

标签: powershell

有一个示例数据文件

Session 1: {21AD8B68-2A42-459e-BD29-F082F47E71B2}  
Started: 06-24-2015 11:00  
NDS Tree: TEST_TREE  
AD Server: dc01.adatum.com  
O=BRANCH/OU=BRANCH_CITY1/CN=user1  
User  
CN=user1,OU=BRANCH_CITY1,OU=ADATUM,DC=adatum,DC=com  
user  
O=BRANCH/OU=BRANCH_CITY1/CN=EVERYONE1  
Group  
CN=EVERYONE1,OU=BRANCH_CITY1,OU=ADATUM,DC=adatum,DC=com  
group  
O=BRANCH/OU=BRANCH_CITY2/CN=user2  
User  
CN=user2,OU=BRANCH_CITY2,OU=ADATUM,DC=adatum,DC=com  
user  
O=BRANCH/OU=BRANCH_CITY2/CN=EVERYONE2  
Group  
CN=EVERYONE2,OU=BRANCH_CITY2,OU=ADATUM,DC=adatum,DC=com  
group 

我想找到一个包含字符串“group”(区分大小写)或“user”(区分大小写)的行。如果匹配,之前的一行应该像这样改变:

如果“用户”之前更改了一行,则CN =< ...>,OU = ADATUM,DC = adatum,DC = com
如果“group”在CN =< ...>之前更改了一行,则OU = GROUPS,OU = ADATUM,DC = adatum,DC = com

当然,输出是包含所有更改的数据文件。

有什么想法吗?

非常感谢提前,
微米。

2 个答案:

答案 0 :(得分:2)

这样的事情可以解决问题:

$scope.colors = [
  {name:'blacksomerandomwords', shade:'dark'},
  {name:'whitesomerandomwords', shade:'light', notAnOption: true},
  {name:'redsomerandomwords', shade:'dark'},
  {name:'bluesomerandomwords', shade:'dark', notAnOption: true},
  {name:'yellowsomerandomwords', shade:'light', notAnOption: false}
]; 
<select ng-model="myColor" ng-options="color.name for color in colors"></select>

答案 1 :(得分:2)

实现此目标的最简单方法可能是使用常规for loop来跟踪行号 - 如果行$n与“user”匹配,则替换行$n-1中的字符串。

要执行区分大小写的正则表达式,请使用-cmatch(请注意c前缀)。在下面的示例中,我使用了named capture group(?<name>pattern))来匹配并捕获usergroup

最后一部分,为现有CN=<...>部分添加新路径可以使用-split命令和lookbehind来完成,以避免弄乱CN值中的转义逗号:

# Read file, line by line
$SampleFile = @(Get-Content C:\path\to\data.txt)
# Loop over the text by line numbers
for($i=0;$i -lt $SampleFile.Count;$i++){
    # Test if the line matches
    if(![string]::IsNullOrWhiteSpace($SampleFile[$i]) -and $SampleFile[$i].Trim() -cmatch "(?<type>^group|user$)"){
        # If so, use the match to determine the DN suffix
        switch($Matches["type"]){
            "group" { $SampleFile[$i-1] = "{0},OU=GROUPS,OU=ADATUM,DC=adatum,DC=com" -f ($SampleFile[$i-1] -split "(?<!\\),")[0] }
            "user"  { $SampleFile[$i-1] = "{0},OU=ADATUM,DC=adatum,DC=com" -f ($SampleFile[$i-1] -split "(?<!\\),")[0] }
        }
    }
}
$SampleFile | Out-File C:\path\to\output.txt -Force