使用Powershell替换/插入换行符

时间:2019-06-30 20:51:01

标签: powershell replace

(我已经读取了其他具有相似名称的线程...)

我是PowerShell的新手。我试图了解如何查找和替换换行符。例如,找到两个换行符,然后用一个换行符替换,反之亦然。

我有一个使用记事本创建的测试文档:

The quick brown fox jumped over the lazy dog
The quick brown fox jumped over the lazy dog

The quick brown fox jumped over the lazy dog
The quick brown fox jumped over the lazy dog

我正在PowerShell ISE中进行测试/学习。

当我运行以下命令时(尝试用两个换行):

((Get-Content -path $filename -raw) -replace '`n','`n`n') | Set-Content -path $filename
Get-Content -path $filename -raw

输出不变。因此,我尝试了以下操作,但它保持不变。

((Get-Content -path $filename -raw) -replace '`r`n','`r`n`r`n') | Set-Content -path $filename

因此,知道PowerShell使用反斜杠而不是反斜杠,但出于无奈,我尝试了以下命令:

((Get-Content -path $filename -raw) -replace '\n','\n\n') | Set-Content -path $filename

而且,令人惊讶的是(对我来说)所有换行符都被替换为字符串文字'\ n \ n'。因此,似乎寻找换行符使用反斜杠而不是反斜杠。不幸的是,替换是文字字符串而不是我需要的CRLF。

我很困惑。但是出于价值考虑,我还尝试了以下操作,再次使用字符串文字代替了该字符串(即,在换行符的位置,文档中包含“ r`n”)。

((Get-Content -path $filename -raw) -replace '\n','`r`n') | Set-Content -path $filename

我见过很多帖子,人们错误地使用了反斜杠,但是对于我来说,搜索似乎需要反斜杠,而且我不知道替换换行符需要什么。

谢谢!

3 个答案:

答案 0 :(得分:2)

'`n'仅匹配文字字符[backtick] [n],这不是您想要的。您想interpret这些值。为此,您需要使用双引号,即'`n'应该为"`n"。据微软称...

  

PowerShell中的特殊字符以反引号开头   字符,也称为重音符(ASCII 96)。 ...这些   字符区分大小写。转义字符只是   在双引号(“)字符串中使用时解释。

答案 1 :(得分:1)

使用双引号。您可能还希望将-nonewline的{​​{1}}选项,以免在文件末尾放置另一个set-content

`r`n

答案 2 :(得分:1)

有几种方法可以做到这一点。第一个是将文件读取为单个字符串,然后对其执行正则表达式-replace: 请记住,在Windows计算机上,换行符是两个字符CR'\r',ASCII值13)和LF'\n',ASCII值10)的组合。

$filename = 'D:\test.txt'

# replace single newlines by a double newline
$replaceWith = '{0}{0}' -f [Environment]::NewLine
(Get-Content -Path $filename -Raw) -replace '\r?\n', $replaceWith | Set-Content -Path 'D:\test-to-double.txt' -Force

# replace double newlines by a single newline
$replaceWith = [Environment]::NewLine
(Get-Content -Path $filename -Raw) -replace '(\r?\n){2}', $replaceWith | Set-Content -Path 'D:\test-to-single.txt' -Force

另一种方法是将文件读为字符串数组(让PowerShell处理单个换行符):

# read the file as string array and join the elements with a double newline
$replaceWith = '{0}{0}' -f [Environment]::NewLine
(Get-Content -Path $filename) -join $replaceWith | Set-Content -Path 'D:\test-to-double.txt' -Force

# read the file as string array and join the elements with a single newline
$replaceWith = [Environment]::NewLine
(Get-Content -Path $filename) -join $replaceWith | Set-Content -Path 'D:\test-to-single.txt' -Force

后一种方法也非常适合在“规范化”文本中的换行符之前删除空白行或仅空白行: 在这种情况下,只需将(Get-Content -Path $filename)替换为(Get-Content -Path $filename | Where-Object { $_ -match '\S' })