给定包含以下内容的test.txt:
test
message
我希望最终得到的结果是:
testing
a message
我认为以下内容应该是可行的,但实际上并不可行:
Get-Content test.txt |% {$_-replace "t`r`n", "ting`r`na "}
我该如何进行查找和替换,其中要查找的内容包含CRLF?
给定包含以下内容的test.txt:
test
message
我希望最终得到的结果是:
testing
a message
Get-Content test.txt |% {$_-replace "t`r`n", "ting`r`na "}
我该如何进行查找和替换,其中要查找的内容包含CRLF?
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
,我成功解决了问题。当然,我不知道你是如何生成原始字符串的,所以我不知道里面有什么内容。
\
n实际上代表一个单一字符,换行符。它并不包含两者!OP代码的问题在于,正如Peter Seale所回答的那样,GC会将文件内容以字符串数组的形式提供给你,其中每个条目都是一行。如果您需要匹配多行内容,则需要先使用
-join "`r`n"`连接数组。 - Teejay\
n代表的是
\n,而不是
\r\n`。 - codaamok$text = [string]::Join("`n", (Get-Content test.txt))
[regex]::Replace($text, "t`n", "ting`na ", "Singleline")
使用 -Raw
,您应该得到预期的结果
(Get-Content test.txt) -join ","
powershell
中使用 "\\r\\n"
来表示新行。我在 servicenow 工具中使用了这种方式。"\r\n"
无法正常工作,所以我尝试使用 "\\r\\n"
,因为在 powershell
中,"\"
是转义字符。您可以使用这个简单的Powershell指令来检测文件是否为CRLF格式
(cat -Raw $args) -match "\r\n$"
替换 \n 为 \r\n 是棘手的,因为您必须先检测它并仅在需要时应用替换,否则会很混乱。太复杂了。
无论如何,您可以忘记检测,在 PowerShell 中确保文件为 CRLF,无论原始类型如何,您可以执行以下操作:
cat $file > $file