我正在尝试阅读文件的内容,在找到与内容匹配后需要再跳过一行&添加一些文字。
对于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)。
答案 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
$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,了解假设的使用方法。