Как изменить строку в определенной строке, содержащейся в файле, сохранив все остальные строки? - PullRequest
0 голосов
/ 10 октября 2019

У меня есть файл, который содержит эту информацию:

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)

Мне нужно изменить данные между {} символами в строке 5, используя powershell, и сохранить изменения, сохранив всю другую информацию в файле.

Ответы [ 5 ]

1 голос
/ 10 октября 2019

Вы можете использовать оператор -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

При наличии требований к кодированию рассмотрите возможность использования параметра -Encoding в командах Get-Content и Set-Content .

1 голос
/ 10 октября 2019

Один из подходов состоит в том, чтобы найти,

(.*Reference=\*\\G{)[^\r\n}]+

и заменить на,

$1any_thing_you_like_to_replace_with

RegEx Circuit

jex.im визуализируетрегулярные выражения:

enter image description here


Если вы хотите упростить / изменить / изучить выражение, это было объяснено на верхней правой панели regex101.com . Если хотите, вы также можете посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами ввода.


1 голос
/ 10 октября 2019

Если содержимое {} всегда одинаково, вы можете сделать это:

(Get-Content $yourfile) -replace $regex, ('{9668818B-3228-49FD-A809-8229CC8AA40F}') | Set-Content $newValue;
1 голос
/ 10 октября 2019

Одно решение:

$Content=Get-Content "C:\temp\test.txt"
$Row5Splited=$Content[4].Split("{}".ToCharArray())
$Content[4]="{0}{1}{2}" -f $Row5Splited[0], "{YOURNEWVALUE}", $Row5Splited[2]
$Content | Out-File "C:\temp\test2.txt"
1 голос
/ 10 октября 2019

Попробуйте Regex: (?<=(?:.*\n){4}Reference=\*\\G\{)[\w-]+

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...