我有一个用于批量电子邮件作业的文本文件。目前,我必须手动浏览文件并在某些条目上设置标志(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'
答案 0 :(得分:2)
您的代码有效,但您没有将新字符串分配给任何内容。 replace返回 new 字符串(字符串是不可变的)。
$logFile[$i + 3] = $logfile[$i + 3].replace('eomm:yes','eomm:no')
您还必须将数组的内容写回文件。
$logFile > YourFileName.txt
答案 1 :(得分:1)
虽然这不是特定于Powershell的解决方案,但您可以实现以下多行正则表达式替换:
查找:
((reci:\r\n){2}subj:\r\n(body:.*\r\n){2}eomm:)(yes)
替换:
$1no
使用您的示例输入在this online regex tester上正确执行。
我写了一个示例脚本来说明如何执行此操作:
$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")