首页 > 解决方案 > 如何更改保留所有其他行的文件中包含的特定行中的字符串?

问题描述

我有一个包含以下信息的文件:

Type=OleDll
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\..\Windows\SysWOW64\stdole2.tlb#OLE Automation
Reference=*\G{7C0FFAB0-CD84-11D0-949A-00A0C91110ED}#1.0#0#..\..\..\..\..\..\..\Windows\SysWOW64\msdatsrc.tlb#Microsoft Data Source Interfaces for ActiveX Data Binding Type Library
Reference=*\G{26C4A893-1B44-4616-8684-8AC2FA6B0610}#1.0#0#..\..\..\..\..\..\..\Windows\SysWow64\Conexion_NF.dll#Zeus Data Access Library 1.0 (NF)
Reference=*\G{9668818B-3228-49FD-A809-8229CC8AA40F}#1.0#0#..\packages\ZeusMaestrosContabilidad.19.3.0\lib\native\ZeusMaestrosContabilidad190300.dll#Zeus Maestros Contables Des (Contabilidad)

我需要使用 powershell 在第 5 行更改 {} 字符之间的数据,并保存更改以保留文件中的所有其他信息。

标签: regexpowershell

解决方案


您可以使用-replace运算符执行正则表达式匹配和字符串替换。

如果每行只有一对{},您可以执行以下操作,.*?尽可能少地匹配任何非换行符。由于默认情况下Get-Content创建的对象是行数组,因此您可以通过索引访问每一行,即[4]第 5 行。

$content = Get-Content File.txt
$content[4] = $content[4] -replace '{.*?}','{new data}'
$content | Set-Content File.txt

如果每行可能有多个{}对,您将需要更具体地使用您的正则表达式。一个积极的后向断言(?<=)就可以了。

$content = Get-Content File.txt
$content[4] = $content[4] -replace '(?<=Reference=\*\\G){.*?}','{newest data}'
$content | Set-Content File.txt

对于不知道哪一行包含要替换的数据的情况,您需要更具体地了解要替换的数据。

Get-Content File.txt -replace '{9668818B-3228-49FD-A809-8229CC8AA40F}','{New Data}' | Set-Content

如果有编码要求,请考虑在Get-ContentSet-Content命令上使用-Encoding参数。


推荐阅读