user3520363
user3520363

Reputation: 380

Format text with powershell and make a new file with new lines

I have some text inside album.txt like

some text1 beta glhjkj
gjkkj beta jjkgj jkj
ljj kgj jkg
gjkj bj beta jkgj

I want to get a formatted text in a second album2.txt in this way

beta glhjkj
beta jjkgj jkj 
beta jkgj

only rows that starts with beta are allowed

I try to test this .ps1 script from C:\temp but doesn't work

# Specifies that this is a PowerShell script
# and that the output data is in text format

[Console ]:: OutputEncoding = [ System.Text.Encoding ]:: UTF8

# Read the contents of the "album.txt" file

$lines = Get-Content .\album.txt

# Change the format of lines starting with "beta" by adding a newline at the end

$formattedLines = $lines | ForEach-Object {
    if ($_ -match '^beta') {
        "$_`n"
    }
}

# Overwrite the contents in the "album2.txt" file with the formatted lines

$formattedLines | Set-Content .\album2.txt

album.txt file is also inside C:\temp.
When I try to run this code nothing happens.

Upvotes: 2

Views: 333

Answers (3)

Santiago Squarzon
Santiago Squarzon

Reputation: 60060

You could use a switch to read your file and match those lines having beta and everything after that word:

& {
    switch -Regex -File .\album.txt {
        '\bbeta\b.*' { $Matches[0] }
    }
} | Set-Content .\album2.txt

See https://regex101.com/r/qJRiP6/1 for the regex details.

Upvotes: 2

user3520363
user3520363

Reputation: 380

I test user3520363 and Santiago code and this solution is good about regex implementation

$contents = Get-Content .\album.txt
$filtered = $contents | Where-Object { $_ -match "\bbeta\s+(.*)" } | ForEach-Object { "beta $($Matches[1])" }
Set-Content -Path .\album2.txt -Value $filtered

Upvotes: 2

user20854397
user20854397

Reputation:

Okay, there is a simple enough way to do this.

Consider this code:

$contents = Get-Content .\album.txt
$filtered = $contents | Where-Object { $_ -match "^beta" }
Set-Content -Path .\album2.txt -Value $filtered

The Where-Object filters the contents of the album.txt file and only include lines that start with "beta".

Now, if you want to add new lines in between the filtered lines, then instead of Set-Content you can use :

$filtered | Out-File -FilePath .\album2.txt -Append -NoClobber

Upvotes: 2

Related Questions