使用powershell在多个文件中匹配模式之前插入空行

使用powershell在多个文件中匹配模式之前插入空行,powershell,powershell-2.0,powershell-3.0,Powershell,Powershell 2.0,Powershell 3.0,要求是在多个文件中的匹配图案行之前插入一个空行 考虑一个包含以下内容的文件 苹果 树 橙色 [水果] 红色 绿色的 预期产出: 苹果 树 橙色的 [水果] 红色 绿色的 尝试下面的代码。帮我找出下面代码中的错误 $FileName = Get-ChildItem -Filter *.ini -Recurse $Pattern = "\[Fruit]\" [System.Collections.ArrayList]$file = Get-Content $FileName $insert = @(

要求是在多个文件中的匹配图案行之前插入一个空行

考虑一个包含以下内容的文件 苹果 树 橙色 [水果] 红色 绿色的

预期产出: 苹果 树 橙色的

[水果] 红色 绿色的

尝试下面的代码。帮我找出下面代码中的错误

$FileName = Get-ChildItem -Filter *.ini -Recurse
$Pattern = "\[Fruit]\"
[System.Collections.ArrayList]$file = Get-Content $FileName
$insert = @()

for ($i=0; $i -lt $file.count; $i++) {
  if ($file[$i] -match $pattern) {
    $insert += $i #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($_," ") }

Set-Content $FileName $file
上述代码适用于单个文件,但对于多个文件,文件内容会重复

试着花点时间正确地学习正则表达式

$Pattern = "\[Fruit\]"

回复:如何使多个文件都能使用此功能

$FileName = Get-ChildItem -Filter *.ini -Recurse
如果只有一个.ini文件,则$FileName将是一个文件

使用通配符和
-Recurse
开关表明您希望找到多个文件;因此,此命令将该文件集合分配给$FileName变量(即,它将是一个数组)

请注意,当您调用
Get Content
时,会传递$FileName

[System.Collections.ArrayList]$file = Get-Content $FileName
$FileName是文件的集合/数组时,这将不起作用


您需要做的是放置一个循环,该循环将执行数组中文件的“插入换行”逻辑foreach(提示)。现在再去看看那些PS教程…

regexr.com-我建议先学习比较运算符是什么;最好不要太多地改变你原来的问题,因为这会使下面的许多评论和答案变得毫无意义。我已将您的第一次尝试和第二次尝试分开。$FileName=“C:\Users\Desktop\working2\*.ini”$Pattern=“[\Fruit\]”[System.Collections.ArrayList]$file=Get Content$FileName$insert=@()for($I=0;$I-lt$file.count;$I++){if($file[$I]-match$Pattern){$insert+$I#记录这一行之前的位置}#现在循环记录的数组位置并插入新文本$insert | Sort Object-DOWNDING | ForEach Object{$file.insert($|,“”)}Set Content$FileName$file以上代码对单个文件工作正常,但对多个文件执行时,每个文件的内容都会重复请花一点时间学习Powershell的基本知识。这门MVA课程是免费的,为您提供了如何开始使用Powershell的良好概述。我尝试了多次,但我能够对单个文件执行操作,但多个文件不起作用