【问题标题】:Replacing new line with space with powershell用powershell用空格替换新行
【发布时间】:2016-06-27 12:11:32
【问题描述】:

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

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

这是我在这个网站上环顾四周时尝试过的众多事情之一。

我正在使用 powershell v3

【问题讨论】:

  • 如果某个答案解决了您的问题,请单击旁边的大复选标记 (✓) 接受它。如果您发现其他答案有帮助,请给他们投票。接受和投票有助于未来的读者。请参阅the relevant help-center article。如果您的问题尚未完全得到解答,请提供反馈。

标签: powershell replace line newline


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    试试这个:

    $NewStr = "";
    Get-Content $Path -Raw | ForEach {$NewStr += "$_ "}
    $NewStr | Set-Content DestinationPath -Force
    

    【讨论】:

      【解决方案3】:

      假设您没有更改 $OFS 的默认值 ' '(一个空格):

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

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

      $OFS 是一个自动变量,它指定用于分隔数组元素的 at 分隔符,并将其强制转换为 [string]。它的默认值为空格,Get-Content 将返回文件中的行数组,删除 CRLF。将其转换为 [string] 然后在文件中生成一个以空格分隔的字符串。

      【讨论】:

        【解决方案4】:

        Keith Hill's helpful answer 很好地解释了您的代码问题并提供了可行的解决方案。

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

        这里有一个更简单的替代方案,可以避免这个问题。

        (Get-Content $path) -join ' ' | Set-Content -Force $root\bob.txt
        
        • (Get-Content $path) 返回一个 array 行,
        • 然后我们将其加入以形成单个输出字符串,每个元素分隔一个空格-此逻辑仅将分隔符(空格)放在中间 元素,而不是最后。

        请注意,这和 Keith 的回答都需要将整个输入文件读入内存,这对于大文件可能存在问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-28
          • 2023-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-27
          • 1970-01-01
          • 2015-02-01
          相关资源
          最近更新 更多