regex - 为什么Powershell Regex.Replace会吞下换行符?

标签 regex powershell replace

我有一个脚本,该脚本在文件上做了一些正则表达式替换。我不明白的是为什么返回的字符串删除了所有的换行符?

样本文件内容(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

显然我在这里错过了一些东西。谁能发现它?

顺便说一句,我试图玩正则表达式。替换并使用带有4个参数的重载,指定RegexOptionsas documented on MSDN,但是脚本失败说此方法没有4个参数重载。 Powershell是否使用其他版本的.Net框架?

最佳答案

之所以会这样,是因为$ content最初是从文件中读取时是一个字符串数组。您可以看到任何变量的类型,如下所示:

$content.GetType().FullName

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

您甚至可以在执行此操作时修改PowerShell如何连接各个元素:
$OFS = ", "
"$content"

而不是使用.NET正则表达式替换,请尝试使用PowerShell的-replace运算符来处理正则表达式:
$content = $content -replace 'll','yy'

关于regex - 为什么Powershell Regex.Replace会吞下换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19276114/

相关文章:

powershell - 如何从注册表更新 Windows PowerShell session 环境变量?

Powershell : Comparing Variable from one CSV to another CSV and create new variable on based of that

powershell - 设置 kerberos 约束委派 powershell

R - 如何替换数据框中的部分变量字符串

regex - 从 gcc/g++ 编译结果中删除文件名

regex - 如何禁用 grep [] 语法中 ^ 字符的特殊含义?

javascript - Javascript 的正则表达式允许除“和%”之外的所有内容

java - Maven war 插件 : Specify Regular Expression to exclude libraries within web-inf/lib

r - 如果单元格包含特定字符串,则复制相邻单元格的字符串

html - 递归搜索和替换/添加html文件中的一些标签属性