Home > Software engineering >  Manipulate strings in a txt file with Powershell - Search for words in each line containing ".&
Manipulate strings in a txt file with Powershell - Search for words in each line containing ".&

Time:09-23

I have a text file with different entries. I want to manipulate it to filter out always the word, containing a dot (using Powershell)

$file = "C:\Users\test_folder\test.txt"
Get-Content $file

Output:

Compass                      Zype.Compass                        1.1.0   thisisaword          
Pomodoro Logger              zxch3n.PomodoroLogger               0.6.3   thisisaword
......
......
......
Bla Word                     Program.Name                        1.1.1   this is another entry

As you can see, in all lines, the "second" "word" contains a dot, like "Program.Name". I want to create a new file, which contains just those words, each line one word.

So my file should look something like:

Zype.Compass
zxch3n.PomodoroLogger
Program.Name

What I have tried so far:

Clear-Host

$folder = "C:\Users\test_folder"

$file = "C:\Users\test_folder\test.txt"

$content_txtfile = Get-Content $file

foreach ($line in $content_textfile)
{
    if ($line -like "*.*"){

        $line  | Out-File "$folder\test_filtered.txt"

        }
}

But my output is not what I want.

I hope you get what my problem is. Thanks in advance! :)

CodePudding user response:

Here is a solution using Select-String to find sub strings by RegEx pattern:

(Get-Content $file | Select-String -Pattern '\w \.\w ').Matches.Value |
    Set-Content "$folder\test_filtered.txt"

You can find an explanation and the ability to experiment with the RegEx pattern at RegEx101.

Note that while the RegEx101 demo also shows matches for the version numbers, Select-String gives you only the first match per line (unless argument -AllMatches is passed).

CodePudding user response:

This looks like fixed-width fields, and if so you can reduce it to this:

Get-Content $file |                         # Read the file
    %{ $_.Substring(29,36).Trim()} |        # Extract the column
    ?{ $_.Contains(".") |                   # Filter for values with "."
    Set-Content "$folder\test_filtered.txt" # Write result
  • Related