0

there is a sample data file

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 

I would like to find a line that contains a string "group" (case sensitive) or "user" (case sensitive). If there will be a match, a line before should be changed like this:

if "user" change a line before to CN=<...>,OU=ADATUM,DC=adatum,DC=com
if "group" change a line before to CN=<...>,OU=GROUPS,OU=ADATUM,DC=adatum,DC=com

Of course, an output is a data file that contains all changes.

Any idea?

Many thanks in advance,
M.

1
  • What is <...> supposed to represent? Do you literally want that or is it supposed to represent some information you need to capture? Commented Jun 25, 2015 at 8:33

2 Answers 2

2

The easiest way to accomplish this is probably by using a regular for loop to keep track of line numbers - if line $n matches "user", replace the string in line $n-1.

To do a case-sensitive regex, use -cmatch (notice the c prefix). In the example below I've used a named capture group ((?<name>pattern)) to match and capture either user or group.

The last part, adding a new path to the existing CN=<...> part can be accomplished with the -split command and a lookbehind to avoid messing up escaped commas in the CN value:

# 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 
Sign up to request clarification or add additional context in comments.

Comments

2

Something like this should do the trick:

$c = Get-Content .\file_name.txt

for ($i = 0; $i -lt $c.length; $i++) {
  if ($c[$i] -cmatch "^group" ) { 
    $c[$i-1] = "CN=<...>,OU=ADATUM,DC=adatum,DC=com"
  }
  elseif ($c[$i] -cmatch "^user") {
    $c[$i-1] = "CN=<...>,OU=GROUPS,OU=ADATUM,DC=adatum,DC=com"
  }
}

$c | Out-File .\new_file.txt

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.