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.
CodePudding user response:
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
CodePudding user response:
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.
CodePudding user response:
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