【问题标题】:Why does powershell Regex.Replace swallows newline?为什么 powershell Regex.Replace 会吞下换行符?
【发布时间】:2013-10-17 01:16:29
【问题描述】:

我有这个脚本可以对文件进行一些正则表达式替换。我不明白为什么返回的字符串都删除了所有换行符?

示例文件内容(UTF-8,每行后有 CR-LF):

hello
hello
hello

脚本:

$content = Get-Content "c:\spikes\regexnewline\regexnewline.txt"
Set-Content "c:\spikes\regexnewline\regexnewline-2.txt" $content # test

$content = [regex]::Replace($content, "ll", "yy") #basic replace

Set-Content "c:\spikes\regexnewline\regexnewline-3.txt" $content

当然,文件regexnewline-2.txt 是输入文件的精确副本。但是为什么regexnewline-3.txt 的内容只有一行,末尾有一个 CR-LF?

heyyo heyyo heyyo\CR\LF

显然我在这里遗漏了一些东西。有人能看出来吗?

顺便说一句,我尝试使用 regex.Replace 并使用带有 4 个参数的重载,指定 RegexOptionsas documented on MSDN,但脚本失败,说明此方法没有 4 个参数重载。 Powershell 是否使用不同版本的 .Net 框架?

【问题讨论】:

  • @如果您在将$content 放入文件之前将其打印到命令行,您会看到什么?

标签: regex powershell replace


【解决方案1】:

你看到这个的原因是因为当你最初从文件中读取时,$content 是一个字符串数组。您可以像这样查看任何变量的类型:

$content.GetType().FullName

Get-Content 默认返回一个字符串数组,其中每个元素代表一行。当您将该数组传递给 .NET 的正则表达式替换方法时,PowerShell 看不到采用字符串数组的方法重载,但确实看到采用字符串的方法重载,因此它将您的字符串数组强制转换为字符串。如果在 Get-Content 调用之后立即执行此操作,您可以看到相同的效果:

"$content"

您甚至可以修改 PowerShell 在执行此操作时连接各个元素的方式:

$OFS = ", "
"$content"

与其使用 .NET 正则表达式替换,不如尝试使用 PowerShell 的 -replace 运算符,它也可以处理正则表达式:

$content = $content -replace 'll','yy'

【讨论】:

  • 谢谢,你是我的英雄!此外,这是一个简化的示例。我使用 .Net 的正则表达式,因为真正的代码使用了 MatchEvaluator,这在单行中有点复杂。
  • 没问题。 MatchEvaluator 非常好用。
  • 这个答案让我在用头撞墙一个小时后松了一口气。我要补充一点,Get-Content -Raw filename 将返回单个字符串,而不是每行字符串的数组。
猜你喜欢
  • 2021-08-03
  • 1970-01-01
  • 2020-03-15
  • 2016-06-08
  • 1970-01-01
  • 2010-11-02
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多