我有一个小的 powershell 脚本,它读取 UTF8 编码的文档,在其中进行一些替换并将其保存回来,如下所示:
(Get-Content $path) -Replace "myregex","replacement" | Set-Content $path2 -Encoding utf8
这将创建一个具有正确编码和正确内容的新文件,但末尾有额外的换行符。根据这个答案和许多其他人,我被告知要:
- 添加参数
-NoNewLine
to Set-Content
- Use
[System.IO.File]::WriteAllText($path2,$content,[System.Text.Encoding]::UTF8)
两种解决方案都删除了尾随的新行......以及文件中的所有其他新行.
有没有办法both:
- 保存文件时删除尾随的新行。
- 将现有的新行保留在我的文件中。
[IO.File]::WriteAllText()
假设$content
是单个字符串,但是Get-Content
生成一个字符串数组(并删除每行/字符串末尾的换行符)。将该字符串数组重整成单个字符串,使用以下方法连接字符串$OFS
字符(参见here).
为了避免这种行为,您需要确保$content
当它被传递到时已经是一个字符串WriteAllText()
。有多种方法可以做到这一点,例如:
-
Use Get-Content -Raw
(PowerShell v3 或更高版本):
$content = (Get-Content $path -Raw) -replace 'myregex', 'replacement'
-
通过管道输出Out-String
:
$content = (Get-Content $path | Out-String) -replace 'myregex', 'replacement' -replace '\r\n$'
但请注意,Out-String
(就像Set-Content
)添加了一个尾部换行符,正如评论中指出的那样。您需要通过第二次替换操作将其删除。
-
将数组加入-join
操作员:
$content = (Get-Content $path) -replace 'myregex', 'replacement' -join "`r`n"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)