我想提取平面文件中的特定行,然后导出到另一个 txt 文件。
最后,我想通过 write-host 添加信息消息。
done. 2 Records have been extracted in "C:\tmp\output.txt"
我的输入文件:
MyComputer1234.child1 [AGE:3606209] 1200 A 172.2.3.4
MyComputer5678 [AGE:1782367] 1200 A 172.5.6.7
MyComputer90AB.child2 [AGE:2457912] 1200 A 172.9.0.1
MyComputerCDEF.child2 [AGE:1982627] 1200 A 172.10.11.12
我的输出:
MyComputer90AB.child2 [AGE:2457912] 1200 A 172.9.0.1
MyComputerCDEF.child2 [AGE:1982627] 1200 A 172.10.11.12
脚本:
get-content $inputfile -ReadCount 1000 |
foreach { $_ -match "child2" }
我想要的输出:
MyComputer90AB [AGE:2457912] 1200 A 172.9.0.1
MyComputerCDEF [AGE:1982627] 1200 A 172.10.11.12
答案 0 :(得分:3)
您没有执行任何操作来删除匹配的字符串部分。这可以通过正则表达式轻松实现。
Get-Content $inputfile |
ForEach-Object {
if($_ -match "child2"){
$_ -replace '\.child2'
}
}
由于句点 (.
) 在正则表达式中具有特殊含义,因此您必须使用反斜杠将其转义。我还建议使用 switch
语句来读取和解析文件。
switch -Regex -File $inputfile {
'child2' {$_ -replace '\.child2'}
}
编辑
基于您的输入文件示例。
$inputfile = New-TemporaryFile
@'
MyComputer1234.child1 [AGE:3606209] 1200 A 172.2.3.4
MyComputer5678 [AGE:1782367] 1200 A 172.5.6.7
MyComputer90AB.child2 [AGE:2457912] 1200 A 172.9.0.1
MyComputerCDEF.child2 [AGE:1982627] 1200 A 172.10.11.12
'@ | Set-Content $inputfile
我提出的第一个解决方案
Get-Content $inputfile |
ForEach-Object {
if($_ -match "child2"){
$_ -replace '\.child2'
}
}
输出
MyComputer90AB [AGE:2457912] 1200 A 172.9.0.1
MyComputerCDEF [AGE:1982627] 1200 A 172.10.11.12
我提出的第二个解决方案
switch -Regex -File $inputfile {
'child2' {$_ -replace '\.child2'}
}
输出
MyComputer90AB [AGE:2457912] 1200 A 172.9.0.1
MyComputerCDEF [AGE:1982627] 1200 A 172.10.11.12
答案 1 :(得分:1)
$content=(Get-Content "path\to\flatfile" | Select-String '\.child2') -replace '\.child2'
if($content)
{
"done. {0} Records have been extracted in `"C:\tmp\output.txt`"" -f $content.count
$content >> "C:\tmp\output.txt"
}