【问题标题】:PowerShell not removing new line charactersPowerShell 不删除换行符
【发布时间】:2021-10-24 23:40:45
【问题描述】:

环境:Windows 10 pro 20H2,PowerShell 5.1.19041.1237

.txt 文件中,我的以下PowerShell 代码没有用" " 替换换行符。 问题:我可能在这里遗漏了什么,我们怎样才能让它发挥作用?

C:\MyFolder\Test.txt 文件:

This is first line.
This is second line.
This is third line.
This is fourth line.

所需的输出 [用“”字符替换换行符后]:

This is first line. This is second line. This is third line. This is fourth line.

PowerShell 代码

PS C:\MyFolder\test.txt> $content = get-content "Test.txt"
PS C:\MyFolder\test.txt> $content = $content.replace("`r`n", " ")
PS C:\MyFolder\test.txt> $content | out-file "Test.txt"

备注

如果我替换文件中的一些其他字符,上面的代码可以正常工作。比如我把上面代码的第二行改成$content = $content.replace("third", "3rd"),代码就成功的把上面文件中的third替换成了3rd

【问题讨论】:

标签: powershell powershell-5.0


【解决方案1】:

您需要将 -Raw 参数传递给 Get-Content。默认情况下,不带Raw参数,内容为returned as an array of newline-delimited strings

获取内容“Test.txt”-Raw

引用文档,

-原始

忽略换行符并在一个字符串中返回文件的全部内容并保留换行符。默认情况下,换行 文件中的字符用作分隔符将输入分隔为 一个字符串数组。此参数是在 PowerShell 3.0 中引入的。

【讨论】:

  • 您的建议奏效了。感谢您提供参考 - 因为它也会帮助这篇文章的其他一些读者。
【解决方案2】:

执行此操作的最简单方法是使用-Raw 开关然后对其进行替换,但利用Get-Content 为您拆分换行符上的内容这一事实.

然后只需使用空格字符加入数组即可。

(Get-Content -Path "Test.txt") -join ' ' | Set-Content -Path "Test.txt"

至于你尝试过的:

通过使用Get-Content 不使用 -Raw 开关,该 cmdlet 会返回一个字符串数组,其中包含在换行符上分割的行。
这意味着结果字符串中不再有没有换行符要替换,只需用空格字符将这些行“缝合”在一起。

如果您确实使用 -Raw 开关,则 cmdlet 会返回一个包含换行符的单个多行字符串。
在您的情况下,您需要自己进行拆分或替换,为此,不要使用字符串方法.Replace,而是使用带有搜索字符串'\r?\n'的正则表达式运算符-split-replace

其中的问号确保您在 Windows 格式 (CRLF) 的换行符上拆分,但也适用于 *nix 格式 (LF)。

【讨论】:

  • 感谢您分享您的想法。我的赞成票。您可能还打算将输出通过管道传输回文件。根据您的建议,以下内容也对我有用:(Get-Content -Path "Test.txt") -join ' ' | Out-File "Test.txt"
  • @nam 啊,是的,使用我没有提到的管道保存到文件,但最好使用Set-Content 作为@js2010 commented
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
相关资源
最近更新 更多