如何使用PowerShell替换换行符?

Iai*_*ain 38 powershell

给定test.txt包含:

test
message
Run Code Online (Sandbox Code Playgroud)

我想最终得到:

testing
a message
Run Code Online (Sandbox Code Playgroud)

我认为以下内容应该有效,但它不会:

Get-Content test.txt |% {$_-replace "t`r`n", "ting`r`na "}
Run Code Online (Sandbox Code Playgroud)

我怎样才能找到并替换我所发现的包含CRLF的地方?

Don*_*nes 37

CRLF是两个字符,当然还有CR和LF.但是,`n由两者组成.例如:

PS C:\> $x = "Hello
>> World"

PS C:\> $x
Hello
World
PS C:\> $x.contains("`n")
True
PS C:\> $x.contains("`r")
False
PS C:\> $x.replace("o`nW","o There`nThe W")
Hello There
The World
PS C:\>
Run Code Online (Sandbox Code Playgroud)

我觉得你遇到了问题`r.我能够`r从您的示例中删除,仅使用`n,并且它有效.当然,我不确切知道你是如何生成原始字符串所以我不知道那里有什么.

  • 这个答案完全是误导性的,至少目前是这样(不知道 14 年来是否有所改变)。`\`n` 实际上代表一个字符,即换行。它不是由两者组成的!OP 代码的问题在于,正如 Peter Seale 所回答的那样,GC 为您提供字符串数组中的文件内容,其中每个条目都是一行。如果需要匹配多行内容,需要先用`-join "\`r\`n"`加入数组 (2认同)

Pet*_*ale 23

根据我的理解,Get-Content在通过管道滚动文本文件时会消除所有换行/回车.要执行多行正则表达式,您必须将字符串数组重新组合成一个巨大的字符串.我做的事情如下:

$text = [string]::Join("`n", (Get-Content test.txt))
[regex]::Replace($text, "t`n", "ting`na ", "Singleline")
Run Code Online (Sandbox Code Playgroud)

澄清:小文件只有人!请不要在40 GB的日志文件中尝试这个:)


nik*_*kov 18

-Raw你应该得到你所期望的

  • 我想这个参数可以作为补救措施,以便在返回除了什么之外的任何东西时,命令的不可原谅的粗鲁.+1为此.我不知道,我吹了1小时试图弄清楚为什么我的琴弦错过了他们的换行符 (3认同)
  • 值得注意的是,PS v2不提供此功能,但是如果您通过管道传输到Out-String,您将获得相同的效果。 (2认同)
  • 你能分享一下例子吗?我找不到它 (2认同)

小智 6

如果您想删除所有换行符并将其替换为某些字符(例如逗号),那么您可以使用以下命令。

(Get-Content test.txt) -join ","
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为 Get-Content 返回行数组。您可以将其视为许多语言中可用的标记化函数。