在特定模式后的行添加文本行

时间:2015-01-12 15:08:50

标签: powershell

作为一个小型个人项目的一部分,我试图学习一些Powershell脚本。

我想解决的当前问题是,给定一个包含数百个ASCII文本文件的文件夹,每个文件:

  • 找到特定文本在.txt文件中的行(可能没有,可能有几行)
  • 如果没有,请在第3行(生成的文件)中添加新文本
  • 如果有一个或多个,请在第一次点击之前将新文本添加为​​新行

我设法找到了如何找到线

gci -literalpath "C:\path" -rec -filter *.txt | % {
$line = Select-String -literalpath $_.fullname -pattern "foo_bar" | select LineNumber
}

我知道如何在特定的行号添加一行(在这种情况下,是生成的文件的第三行)

gci -literalpath "C:\path" -rec -filter *.txt | % {
$file = get-Content -literalpath $_.fullname
set-content -literalpath $_.fullname -value ($file[0..1] + "newline" + $file[2..($file.Length-1)])
}

我遇到的问题是,我似乎无法使用$line,我期待int(因为LineNumber),但如果我输入$line.GetType()我得到PSCustomObject作为答案,我无法找到从中提取整数值的方法,如果我打印$line,我会得到类似于

的输出
LineNumber
-------------
4
5
10

我错过了什么吗?有没有更简单的方法来实现我想要的目标?

1 个答案:

答案 0 :(得分:3)

你可以像这样得到Linenumber:

$line.LineNumber

或者你可以这样做:

gci -literalpath "C:\path" -rec -filter *.txt | % {
$line = Select-String -literalpath $_.fullname -pattern "foo_bar" | select -ExpandProperty LineNumber
}

在这种情况下,您将拥有一个整数变量。请注意,如果您有多个匹配项,则它将是一个数组,而不是一个整数。

为了您将来的努力,cmdlet Get-Member可能会帮助您探索PSObject。

使用示例:$line | get-member