使用powershell用空格替换新行

问题描述 投票:0回答:4

嗨,我已经研究这个问题有一段时间了,但我尝试过的都没有效果。请原谅我再次问这个问题,但我无法在 powershell 中用空格替换新行

$path = "$root\$filename"
Get-Content $path | % $_.Replace "`r`n"," " | Set-Content "$root\bob.txt" -Force

这是我在这个网站上尝试过的众多事情之一。

我正在使用 powershell v3

powershell replace line newline
4个回答
6
投票

这里有几个问题。 首先,按照您调用 Get-Content 的方式,沿着管道发送的字符串中永远不会有换行符。这是因为 Get-Content 的默认工作方式是在换行符上拆分文件并为每行输出一个字符串。 其次,您的 Foreach 命令需要在替换命令周围使用 {}。 试试这个:

Get-Content $path -Raw | Foreach {$_ -replace "`r`n",' '} | 
    Set-Content $root\bob.txt -Force

-Raw
参数指示
Get-Content
将文件内容作为单个字符串读取。 这将保留
CRLFs


6
投票

Keith Hill 的有用答案很好地解释了代码的问题并提供了可行的解决方案。

但是,Keith 的解决方案在输出行中添加了一个尾随空格(如果它有效的话,就像您自己的解决方案尝试所做的那样)。

这里有一个更简单的替代方案,可以避免此问题(请注意下面的字符编码警告):

(Get-Content $path) -join ' ' | Set-Content -Force $root\bob.txt
  • (Get-Content $path)
    返回线的 array
  • 然后我们连接形成单个输出字符串,每个元素分隔由一个空格 - 这个逻辑仅将分隔符(空格)放置在元素之间,而不是放在末尾。
请注意,这个和 Keith 的答案都需要将整个输入文件读入内存,但对于文本文件来说,这很少是问题。


字符编码警告:您可能需要在上面的命令中传递-Encoding

参数...

  • ... 至

    Get-Content

     以确保源文件正确读取
    

    ...至
  • Set-Content

    以确保新内容

    书写
    正确。

    在使用
      text
    • 处理的 PowerShell 管道中,

      从中读取字符串的文件的原始编码永远不会保留;相反,在没有 Set-Content 参数的情况下应用的是 -Encoding

      默认编码;如前所述,Windows PowerShell
       中的默认值是 
      ANSIPowerShell 7 中的默认值是无 BOM UTF-8。

      UTF-8 的结果是:
    • 使用
        -Encoding utf8
      • 确保文件写入为 UTF-8,但请注意:

          Windows PowerShell
        • 中,这总是会创建一个带有 BOM

          的 UTF-8 文件,这可能是不需要的。 要在 Windows PowerShell 中创建无 BOM

          UTF-8 文件需要
            解决方法
          • ,可以直接使用 .NET API 或通过 New-Item cmdlet;有关详细信息,请参阅此答案
            
            
            
          PowerShell 7
        • 中,此参数是多余的,并且会创建一个
        • BOM-less

          UTF-8 文件,但您可以使用 -Encoding utf8BOM 来请求创建一个带有 BOM 的文件。

          
          
          
          

  • 假设您没有更改
$OFS

4
投票
' '

(单个空格):


[string](Get-Content $path) | Set-Content -Force $root\bob.txt

"$(Get-Content $path)" | Set-Content -Force $root\bob.txt

$OFS
 是一个自动变量,指定分隔符,该分隔符将用于分隔数组的元素,并将其强制转换为 
[string]

。 它的默认值为空格,

Get-Content
将返回文件中行的数组,删除 CRLF。将其转换为
[string]
然后会在文件中生成一个以空格分隔的行字符串。
    
试试这个:


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.