regex - 如何更改保留所有其他行的文件中包含的特定行中的字符串?
问题描述
我有一个包含以下信息的文件:
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 行更改 {} 字符之间的数据,并保存更改以保留文件中的所有其他信息。
解决方案
您可以使用-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-Content和Set-Content命令上使用-Encoding
参数。
推荐阅读
- php - HTML/PHP 表单 - 变量无缘无故设置为 0
- elasticsearch - Elastic 6.x 中的类型点
- c# - 基于颜色的 WPF DataTrigger
- google-cloud-platform - 使用 bq CLI 在 bigquery 中列出数据集中的所有表并将它们存储到谷歌云存储
- c++ - clang:候选模板被忽略:替换失败:typedef'type'不能用类说明符引用
- rabbitmq - Ansible 没有使用 rabbitmq_user 模块创建 RabbitMQ 用户
- java - 如何将对象中的多个字段与对象队列进行比较?
- javascript - 将 var 声明(例如 var x;)覆盖以前的值
- java - 如何从 Java Play 框架中的动作返回结果?
- google-drive-api - 如何从谷歌绘图中提取文本?