Note:
- The assumption is that
s/././g
in your sed
command is just a example string substitution that you've chosen as a placeholder for real-world ones. What this example substitution does is to replace all characters other than newnlines (regex .
) with a verbatim .
Therefore, do not run the commands below as-is on your files, unless you're prepared to have their characters turn into .
The direct translation of your sed
command, which performs in-place updating of the input file, is (ForEach-Object
is the name of the cmdlet that the built-in %
alias refers to):
(Get-Content dist/index.html) |
ForEach-Object { $_ -replace '.', '.' } |
Set-Content dist/index.html -WhatIf
Note: The -WhatIf
common parameter in the command above previews the operation. Remove -WhatIf
once you're sure the operation will do what you want.
Or, more efficiently:
(Get-Content -ReadCount 0 dist/index.html) -replace '.', '.' | Set-Content dist/index.html -WhatIf
-ReadCount 0
reads the lines into a single array before outputting the result, instead of the default behavior of emitting each line one by one to the pipeline.
Or, even more efficiently, if line-by-line processing isn't required and the -replace
operation can be applied to the entire file content, using the -Raw
switch:
(Get-Content -Raw dist/index.html) -replace '.', '.' | Set-Content -NoNewLine dist/index.html -WhatIf
Note:
-replace
, the regular-expression-based string replacement operator uses the syntax <input> -replace <regex>, <replacement>
and invariably performs global replacements (as requested by the g
option in your sed
command), i.e. replaces all matches it finds.
- Unlike
sed
's regular expressions, however, PowerShell's are case-insensitive by default; to make them case-sensitive, use the -creplace
operator variant.
Note the required (...)
around the Get-Content
call, which ensures that the file is read into memory in full and closed again first, which is the prerequisite for being able to rewrite the file with Set-Content
in the same pipeline.
- Caveat: While unlikely, this approach can result in data loss, namely if the write operation that saves back to the input file gets interrupted.
You may need -Encoding
with Set-Content
to ensure that the rewritten file uses the same character encoding as the original content - Get-Content
reads text files into .NET strings recognizing a variety of encodings, and no information is retained as to what encoding was encountered.
Except with the Get-Content -Raw
/ Set-Content -NoNewLine
solution, which preserves the original newline format, the output file will use the platform-native newline format - CRLF (\r\n
) on Windows, LF (\n
) on Unix-like platforms - irrespective of which format the input file originally used.