Today I needed to write a PowerShell script to add new lines to a text file, and also remove lines that matched a specific pattern. This is reasonably straight forward, but the catch was that the file had to use Unix line endings (i.e. a single line feed character, rather than a carriage return followed by a line feed, as is used in Windows).
The second catch was that I had to use PowerShell 4.0, which means I couldn't use the NoNewline switch that is supported by Set-Content in PowerShell 5.0.
Here is the approach I adopted:
$ascii = [system.text.encoding]::ascii
$ending = "`n"
function append($file, $text) {
[io.file]::appendalltext($file, "$text$ending", $ascii)
}
function remove($file, $text) {
$content = (get-content $file | ? { $_ -notmatch $text }) -join $ending
[io.file]::writealltext($file, $content, $ascii)
}
Here is an example of the functions in action:
# create an empty file.
$file = "c:\temp\test.txt"
new-item $file -type file -force | out-null
# add some content.
append $file "fred smith"
append $file "jack jones"
append $file "mary chang"
# remove lines matching "jack".
remove $file "jack"
The expected output:
fred smith`nmary chang