Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用powershell解析和替换不规则多行文本文件中的值_Regex_Powershell - Fatal编程技术网

Regex 使用powershell解析和替换不规则多行文本文件中的值

Regex 使用powershell解析和替换不规则多行文本文件中的值,regex,powershell,Regex,Powershell,我有一个文本文件,用于批处理电子邮件作业。目前,我必须手动浏览该文件,并在某些条目上设置标志(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: eom

我有一个文本文件,用于批处理电子邮件作业。目前,我必须手动浏览该文件,并在某些条目上设置标志(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个“subc:”条目、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”。似乎它应该与我所拥有的一起工作,但replace函数不起作用。我还尝试了以下方法,但没有成功:

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

尽管这不是特定于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")

您的代码可以工作,但您没有将新字符串分配给任何对象。replace返回一个新的字符串(字符串是不可变的)

还必须将数组的内容写回文件

$logFile > YourFileName.txt

你搞定了。谢谢杜加斯!我知道我很接近谢谢你,尼昂塔皮尔。我试着让你的榜样为我效劳,但没有成功。不过,我对更复杂的正则表达式还很陌生。我用一个工作脚本更新了我的答案。我花了几次时间才意识到在线正则表达式测试仪上的行尾与我的Windows机器上的行尾不同。
$logFile > YourFileName.txt