有没有一种方法可以读入文件,使用正则表达式替换并输出文件,而不会弄乱行尾和无效字符?

阿德里安

我有一个Visual Studio生成的ASCII文件,该文件的行尾不一致,并且其中有些字符值> 127。

我想读入文件,对文本执行正则表达式替换(忽略字符值> 127),然后写回文件而不更改行尾或值> 127的字符。

我所拥有的最好的是:

(Get-Content $rcFile) -replace 
     "(FILEVERSION\s+|VALUE\s+`"(?:FileVersion|ProductVersion)`",\s+(`"))$old_major([,.])$old_minor2(?:\3)$old_minor1(?:\3)0",
     "`${1}$new_major`${3}$new_minor2`${3}$new_minor1`${3}0" | Set-Content "$rcfile.new"

但是该行的结尾不一样。\r在起点和终点附近有一个流浪,可以将其转换为a \r\n我想保持原样,因为它一直被VS环境踢回,并且导致文件无缘无故地被检出。

这是一个迷失的原因吗?

安斯加·威彻斯(Ansgar Wiechers)

从PowerShell v3开始,Get-Content有一个参数-Raw可以读取整个文件,而无需将其拆分为行。但是,Set-Content始终将CR-LF放在它写入的字符串的末尾,因此这种方法对您不起作用。

使用ReadAllText()WriteAllText()方法代替:

$txt = [IO.File]::ReadAllText($rcFile) -replace ...
[IO.File]::WriteAllText("$rcFile.new", $txt)

如果需要,您可以指定读取的文件和/或要写入的文件编码

$txt = [IO.File]::ReadAllText($rcFile, $readEncoding) -replace ...
[IO.File]::WriteAllText("$rcFile.new", $txt, $writeEncoding)

某些编码可用作预定义的常量(例如[Text.Encoding]::ASCII[Text.Encoding]::UTF8),但是您也可以按代码页定义编码。在这种情况下,文件显然是使用美国OEM代码页([Text.Encoding]::GetEncoding('IBM437'))进行编码的

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档