如何在文件中收集字符串并将其用于替换

时间:2018-08-10 07:42:41

标签: powershell

我目前正在尝试逐行解析文件并将其用于指令替换。

在我的第一个名为 filein.txt 的文件中,

具有此类信息(信息不固定):

test 1
test
test 3
test 4
test test 
Mr Test

在名为 filechg.txt 的第二个文件中,我需要通过在文件 filein.txt

中找到字符串来替换其上的字符。

信息看起来像CSV

6672;Mr test;Ticket;Off;Active;F;
5948;test 4;Ticket;Off;Active;F;
6672;Mr test;Ticket;Off;Active;F;
5948;test 2;Ticket;Off;Active;F;
6672;Mr test;Ticket;Off;Active;F;
5948;test 6;Ticket;Off;Active;F;
6672;test 7;Ticket;Off;Active;F;
5948;tests;Ticket;Off;Active;F;
6672;Mr test;Ticket;Off;Active;F;

通过查找字符串,我替换了字符串; F;通过; T;

为此,我正在这样做:

filechg= 'c:\temp\filechg.txt'
filein= 'c:\temp\filein.txt'

  foreach($line in $filein) { 
     Get-Content $filechg | % {$_ -replace "($line.*)F;", '$1T;'} | Set-Content $filechg
  }

似乎我可以在foreach指令中回显变量“行”,但不能将其用于替换指令。

响应应为:

6672;Mr test;Ticket;Off;Active;T;
5948;test 4;Ticket;Off;Active;T;
6672;Mr test;Ticket;Off;Active;T;
5948;test 2;Ticket;Off;Active;T;
6672;Mr test;Ticket;Off;Active;T;
5948;test 6;Ticket;Off;Active;T;
6672;test 7;Ticket;Off;Active;T;
5948;tests;Ticket;Off;Active;T;
6672;Mr test;Ticket;Off;Active;T;

您能帮我解决这个问题吗?

亲切的问候

1 个答案:

答案 0 :(得分:2)

您只需要读入文件内容,但是至少可以读一次脚本不读的内容。 并将所有替换项应用于读取变量,此处为itertools.groupby

>>> from itertools import groupby
>>> f = lambda l: l[-1]
>>> [[k]+[l[0] for l in v] for k,v in groupby(sorted(arr, key=f), f)]
[['abd', 'bad'], ['act', 'act', 'cat', 'tac'], ['adf', 'fad']]

示例显示输出(取消注释最后一行以将结果写入文件)

$content

filein中的行$filechg = '.\filechg.txt' $filein = '.\filein.txt' $content = Get-Content $filechg foreach($line in (Get-Content $filein)) { $content = $content -replace "($line.*)F;", '$1T;' } $content # $content | Set-Content $filechg 呈现了所有其他多余的内容,因为filechg的所有行中都存在此字符串。为了避免这种情况,请在filein行的末尾添加一个6672;Mr test;Ticket;OfT;Active;T; 5948;test 4;Ticket;OfT;Active;T; 6672;Mr test;Ticket;OfT;Active;T; 5948;test 2;Ticket;Off;Active;T; 6672;Mr test;Ticket;OfT;Active;T; 5948;test 6;Ticket;Off;Active;T; 6672;test 7;Ticket;Off;Active;T; 5948;tests;Ticket;Off;Active;T; 6672;Mr test;Ticket;OfT;Active;T;