我正在寻找一种在行前添加文字的方法。 更具体地说,在一行和一个空格之前。 现在,脚本在行[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
感谢您的任何建议!
即使您只是指着我在哪里寻找答案,我们将非常感激。
答案 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("[")
)的开头触发插入。然而,这会使事情变得复杂,因为现在你必须向前看两行,这意味着你必须在写出之前缓冲一行。可行,但丑陋。