powershell:在特定行之前而不是之后附加文本

时间:2017-10-05 09:23:13

标签: regex powershell powershell-v5.0

我正在寻找一种在行前添加文字的方法。 更具体地说,在一行和一个空格之前。 现在,脚本在行[companyusers]之后添加了我的文本。 但是我想在[CompanytoEXT]之前和[CompanytoEXT]上方的空白处之前添加该行。

有人知道怎么做吗?

我想做的事情的视觉表现:https://imgur.com/a/lgH5i

我目前的剧本:

$FileName = "C:\temptest\testimport - Copy.txt"
$Pattern = "[[\]]Companyusers"  
$FileOriginal = Get-Content $FileName

[String[]] $FileModified = @() 
Foreach ($Line in $FileOriginal)
{   
    $FileModified += $Line
    if ($Line -match $pattern) 
    {
        #Add Lines after the selected pattern 
        $FileModified += "NEWEMAILADDRESS"

    } 
    }

Set-Content $fileName $FileModified

感谢您的任何建议!

即使您只是指着我在哪里寻找答案,我们将非常感激。

2 个答案:

答案 0 :(得分:2)

使用ArrayList可能会更容易,这样您就可以轻松地在特定点插入新数据:

$FileName = "C:\temptest\testimport - Copy.txt"
$Pattern = "[[\]]Companyusers"
[System.Collections.ArrayList]$file = Get-Content $FileName
$insert = @()

for ($i=0; $i -lt $file.count; $i++) {
  if ($file[$i] -match $pattern) {
    $insert += $i-1 #Record the position of the line before this one
  }
}

#Now loop the recorded array positions and insert the new text
$insert | Sort-Object -Descending | ForEach-Object { $file.insert($_,"NEWEMAILADDRESS") }

Set-Content $FileName $file

首先将文件打开到ArrayList中,然后循环遍历它。每次遇到模式时,都可以将先前的位置添加到单独的数组$insert中。完成循环后,您可以循环$insert数组中的位置并使用它们将文本添加到ArrayList中。

答案 1 :(得分:0)

这里需要一个小型的状态机。注意找到正确的部分,但不要插入行。仅插入下一个空行(或文件的末尾,如果该部分是文件中的最后一行)。

Haven未经过测试,但应该是这样的:

$FileName = "C:\temptest\testimport - Copy.txt"
$Pattern = "[[\]]Companyusers"  
$FileOriginal = Get-Content $FileName

[String[]] $FileModified = @() 

$inCompanyUsersSection = $false

Foreach ($Line in $FileOriginal)
{   
    if ($Line -match $pattern) 
    {
        $inCompanyUsersSection = $true
    }

    if ($inCompanyUsersSection -and $line.Trim() -eq "")
    {
        $FileModified += "NEWEMAILADDRESS"
        $inCompanyUsersSection = $false
    } 

    $FileModified += $Line
}

# Border case: CompanyUsers might be the last sction in the file
if ($inCompanyUsersSection)
{
    $FileModified += "NEWEMAILADDRESS"
} 

Set-Content $fileName $FileModified

编辑:如果您不想使用"插入下一个空行"方法,因为您的部分可能包含空行,您也可以在下一部分($line.StartsWith("["))的开头触发插入。然而,这会使事情变得复杂,因为现在你必须向前看两行,这意味着你必须在写出之前缓冲一行。可行,但丑陋。