Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 有没有一种方法可以在不弄乱行尾和无效字符的情况下读入文件、使用正则表达式替换并输出文件?_Regex_Powershell_File Io - Fatal编程技术网

Regex 有没有一种方法可以在不弄乱行尾和无效字符的情况下读入文件、使用正则表达式替换并输出文件?

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

我有一个由VisualStudio生成的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
,它被转换为
\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)