Regex 有没有一种方法可以在不弄乱行尾和无效字符的情况下读入文件、使用正则表达式替换并输出文件?
我有一个由VisualStudio生成的ASCII文件,它有不一致的行尾,其中有些字符值大于127 我希望读入文件,对文本执行正则表达式替换(忽略字符值>127),然后在不更改行结尾或值>127的字符的情况下写回文件 我所拥有的最好的是:Regex 有没有一种方法可以在不弄乱行尾和无效字符的情况下读入文件、使用正则表达式替换并输出文件?,regex,powershell,file-io,Regex,Powershell,File Io,我有一个由VisualStudio生成的ASCII文件,它有不一致的行尾,其中有些字符值大于127 我希望读入文件,对文本执行正则表达式替换(忽略字符值>127),然后在不更改行结尾或值>127的字符的情况下写回文件 我所拥有的最好的是: (Get-Content $rcFile) -replace "(FILEVERSION\s+|VALUE\s+`"(?:FileVersion|ProductVersion)`",\s+(`"))$old_major([,.])$old_mino
(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
,它被转换为\r\n
。我想保持原样,因为它一直被VS环境踢回,并导致文件被无故签出
这是一个丢失的原因吗?从PowerShell v3开始,有一个参数
-Raw
,用于读取整个文件而不将其拆分为一个行数组。但是,Set Content
总是将CR-LF放在它所写字符串的末尾,因此这种方法不适合您
请改用以下方法:
$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')
)。请尝试@lloyd,该链接用于XML文件。发生这种情况的文件是纯文本文件。也许包括更多的powershell部分,这样我就可以知道发生了什么。是的,我已经试过了。这就是为什么我声明的字符值大于127
,因为这会弄乱这些字符。在看不到文件的实际内容的情况下,我唯一能建议的是使用编码或编辑文件的字节(ReadAllBytes()
/writealbytes()
)。该文件是一个.rc
文件,内容大部分为常规文本,大部分为\r\n
行结尾。有一些\r
行结尾,以及一些由十六进制值字符组成的字符串92
,96
,A3
,A9
,等等。我将尝试使用encoding
参数。我不确定如何在powershell中生成新的[System.Text]::asciencecoding
对象。你有例子吗?[Text.Encoding]::ASCII
或[Text.Encoding]::GetEncoding($codepage)
。