【问题标题】: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
【问题讨论】:
标签:
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 的回答都需要将整个输入文件读入内存,这对于大文件可能存在问题。