鉴于 test.txt 包含:
test
message
我想最终:
testing
a message
我认为以下内容应该有效,但事实并非如此:
Get-Content test.txt |% {$_-replace "t`r`n", "ting`r`na "}
如何找到并替换我找到的包含CRLF的地方?
答案 0 :(得分:34)
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:\>
我认为你遇到`r
的问题。我能够从您的示例中移除`r
,仅使用`n
,并且它有效。当然,我不确切知道你是如何生成原始字符串所以我不知道那里有什么。
答案 1 :(得分:20)
根据我的理解,当Get-Content通过管道滚动文本文件时,{{3}}会消除所有换行/回车。要执行多行正则表达式,您必须将字符串数组重新组合成一个巨大的字符串。我做了类似的事情:
$text = [string]::Join("`n", (Get-Content test.txt))
[regex]::Replace($text, "t`n", "ting`na ", "Singleline")
澄清:小文件只有人!请不要在40 GB日志文件中尝试此操作:)
答案 2 :(得分:16)
使用-Raw
,您应该得到您期望的结果
答案 3 :(得分:1)
如果要删除所有换行符,并用某些字符替换(例如逗号),则可以使用以下内容。
(Get-Content test.txt) -join ","
这行得通,因为Get-Content返回行数组。您可以将其视为支持多种语言的令牌化功能。
答案 4 :(得分:0)
您也可以将"\\r\\n"
用于powershell
的新行。我已经在servicenow工具中使用了它。
在我的情况下,"\r\n"
无法正常工作,因此我尝试将"\\r\\n"
设置为"\"
,此符号在powershell
中用作转义字符。