2

我有一个用于批处理电子邮件作业的文本文件。目前,我必须手动浏览文件并在某些条目上设置标志 (eomm:),以便不发送电子邮件。该文件可以包含数百行。这是文件的快照:

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 个“subj:”条目、2 个或更多“body:”条目和一个“eomm:”条目开头,按此顺序排列。 目前,我必须找到只有 2 个“body:”条目但“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:yes”替换为“eomm:no”。似乎它应该适用于我所拥有的,但替换功能不起作用。我还尝试了以下方法,但没有成功:

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

2 回答 2

2

您的代码有效,只是您没有将新字符串分配给任何东西。替换返回一个字符串(字符串是不可变的)。

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

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

$logFile > YourFileName.txt
于 2013-09-25T18:26:25.473 回答
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")
于 2013-09-25T18:09:33.957 回答