2013-09-25 39 views
2

替换值我有一个用于批量电子邮件作业的文本文件。目前,我必须手动浏览文件并在某些条目上设置标志(eomm :),以便不发送电子邮件。该文件可以包含数百行。下面是该文件的快照:解析和不规则的多行文本文件使用PowerShell

reci: 
reci: 
subj: 
body: 
body: 
eomm:yes 
reci: 
reci: 
subj: 
body:Your request for... 
body: 
eomm:no 
reci: 
reci: 
subj: 
body:Your request for... 
body:app_name 
body: 
eomm:yes 
reci: 
reci: 
subj: 
body:Your request for... 
body: 
eomm:yes 
reci: 
reci: 
subj: 
body:Your request for... 
body: 
body: 
body: Please note that... 
body: 
body:Because the application you selected requires an install,... 
eomm:yes 

所以,每个电子邮件以2开始“RECI:”项,1“主旨:”条目,2个或更多的身体:“项,和一个“eomm:”输入,按顺序。 目前,我必须找到条目只有2的身体:“项,但有一个“eomm:”值设置为“yes”,并将其更改为“no”。 这是我需要自动化。

到目前为止,我有通过这次找这种模式循环,但只找到了最后一场比赛的脚本。 (我有结果去输出文件来验证它实际上在做什么)。这是我到目前为止有:

$logfile = gc ./cstemail.txt 
for ($i = 0; $i -lt $logfile.count; $i++) { 
    if ($logfile[$i] -match 'subj:') { 
     if ($logfile[$i + 1] -match 'body:') { 
     if ($logfile[$i + 2] -match 'body:') { 
      if ($logfile[$i + 3] -match 'eomm:yes') { 
        $logfile[$i + 3].replace('eomm:yes','eomm:no') 
       } 
      } 
     } 
    } 
} 

我最后的脚本需要能够找到这些行并替换:用“eomm:没有”'eomm肯定的。似乎它应该与我有的,但替换功能不起作用。我也试过,没有运气以下:

$logfile[$i + 3] -replace 'eomm:yes','eomm:no' 

回答

2

你的代码的工作,但你不分配新的字符串到任何东西。替换回报字符串(string是不可改变的)。

$logFile[$i + 3] = $logfile[$i + 3].replace('eomm:yes','eomm:no') 

您还必须将数组内容写回到文件中。

$logFile > YourFileName.txt 
+0

你钉了它。感谢dugas!我知道我很亲密。 :) – N1tr0

1

虽然这不是一个特定的PowerShell的解决方案,可以实现以下多行的正则表达式替换:

查找:

((reci:\r\n){2}subj:\r\n(body:.*\r\n){2}eomm:)(yes) 

替换:

$1no 

它在上正确执行使用您的示例输入。

我写了一个示例脚本来说明如何做到这一点:

$entireFile = [Io.File]::ReadAllText(".\input.txt") 
$nl = [Environment]::NewLine 

$newLines = $entireFile -replace "(?m)((reci:${nl}){2}subj:${nl}(body:.*${nl}){2}eomm:)(yes)", '$1no' 
$newLines > "output.txt" 

# Show differences 
compare-object -referenceObject $(gc "input.txt") -differenceObject $(gc "output.txt") 
+0

谢谢neontapir。我试图让你的榜样为我工作,但没有运气。尽管对于更复杂的正则表达式我很新。 – N1tr0

+0

我用一个工作脚本更新了我的答案。我花了几次才意识到,在线正则表达式测试程序中的行结束符与我的Windows计算机上的行结束符不同。 – neontapir