搜索文件中的内容&在一行之后添加一些文本

时间:2015-05-25 13:20:22

标签: powershell

我正在尝试阅读文件的内容,在找到与内容匹配后需要再跳过一行&添加一些文字。

对于Ex:我的文本文件包含:

cd $home/t17_0/download/functional-tests/
ant compile-all
cd $home/15_5/download/functional-tests/
ant compile-all
cd $home/15_7/download/functional-tests/
ant compile-all

我希望与cd $home/15_5/download/functional-tests/(第3行)匹配,并在ant compile-all(第4行)后添加cd $home/15_6/download/functional-tests/。请注意,在我的实际情况中,我不知道行号。

我可以编写脚本来匹配内容后添加文本,如下所示:

$mat='cd $home/15_5/download/functional-tests/'
$add='cd $home/15_6/download/functional-tests/'
$file_content=get-content text.txt
($file_content) | foreach-object {
    $_ 
    if ($_ -contains $mat) 
    {
        $add
    }
}| set-content $file_content

这是与cd $home/15_5/download/functional-tests/匹配的行(第3行),并在cd $home/15_6/download/functional-tests/之前添加ant compile-all(行号4)。

2 个答案:

答案 0 :(得分:1)

有几种方法可以解决这个问题。例如,您可以使用正则表达式:

$file = 'C:\path\to\your.txt'

$mat  = 'cd $home/15_5/download/functional-tests/'
$add  = 'cd $home/15_6/download/functional-tests/'

$pattern = "(?m)(" + [regex]::escape($mat) + "`r`nant compile all)"

(Get-Content $file -Raw) -replace $pattern, "`$1`r`n$add" |
  Set-Content $file

StreamReader

$file = 'C:\path\to\your.txt'

$mat  = 'cd $home/15_5/download/functional-tests/'
$add  = 'cd $home/15_6/download/functional-tests/'

$reader = [IO.File]::OpenText($file)

$text = while ($reader.Peek() -ge 0) {
          $line = $reader.ReadLine()
          $line
          if ($line -eq $mat) {
            $reader.ReadLine()
            $add
          }
        }
$reader.Close()

$text | ? { $_ } | Set-Content $file

上面的? { $_ }过滤器可以防止在$text为空的情况下截断文件。

答案 1 :(得分:0)

当您使用Get-Content时,每行都有一个Readcount,我们可以使用它来查找与您的文本匹配的行,然后将这些行输出回文件。我们还需要转义文本$toMatch,因为它包含正则表达式控制字符($)。

$toMatch = [regex]::Escape('cd $home/15_5/download/functional-tests/')
$toAdd = 'cd $home/15_6/download/functional-tests/'
$fileData = Get-Content $pathtofile
$matchedLineNumber = $fileData | Where-Object{$_ -match $toMatch} | Select-Object -Expand ReadCount

$fileData | ForEach-Object{
    $_
    If($_.ReadCount -eq ($matchedLineNumber + 1)){
        $toAdd
    }
} | Set-Content $pathtofile

如果文件很大,那么使用Ansgar's Answer之类的内容会更有效率。 $matchedLineNumber包含我们找到文本的行号。然后在循环内部我们寻找下一行(使用+1的地方)。找到匹配后,我们会输出额外的文字$toAdd

<强> - 包含

这是PowerShell的陷阱之一。请查看this answer,了解假设的使用方法。