如何通过只知道一部分线来替换文本文件中的整行?

时间:2017-12-01 21:11:14

标签: powershell

我有一个包含与

类似的文本文件

Settings amount ="01:00:00"

我知道如何更换线路,但我的问题是,如果我知道线路的确切内容,我只能更换整条线路 - 使用-match-replace。但是,有没有办法可以只搜索Settings amount =,然后用我的新设置替换整行?这样,无论当前值是什么,我都有能力扫描并给它一个不同的值。

这就是我目前所拥有的。

$DesiredTime = 'Settings amount="06:00:00" />'

$path = "C:\Windows\File.txt" 
 (Get-Content $path) -replace 'Settings amount="01:00:00" />', $DesiredTime | out-file $path

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

看看Select-String。它将允许您查找包含您要查找的内容的整个行。然后你可以更新该行。

这是一个示例文件

apple = yummy
bananna = yummy
pear = awful
grapes = divine

说我想替换包含" pear"的行。首先得到一句话:

$line = Get-Content c:\temp\test.txt | Select-String pear | Select-Object -ExpandProperty Line

现在我们只需阅读内容并用我们的行替换该行:

$content = Get-Content c:\temp\test.txt
$content | ForEach-Object {$_ -replace $line,"pear = amazing"} | Set-Content c:\temp\test.txt

确认更改

Get-Content C:\temp\test.txt
apple = yummy
bananna = yummy
pear = amazing
grapes = divine

请注意,如果您正在使用XML,您可能会将该文档作为XML文档打开,只需替换该属性即可。如果没有看到源文件的样本,很难说清楚。

答案 1 :(得分:3)

感谢您的代码。效果很好,但只想补充一点,如果根本找不到该字符串,这将变得很糟糕。它将替换文件中的每一行。这通过检查null来解决我的问题:

$line = Get-Content c:\temp\test.txt | Select-String pear | Select-Object -ExpandProperty Line

if ($line -eq $null) {
"String Not Found"
exit
} else {
$content = Get-Content c:\temp\test.txt
$content | ForEach-Object {$_ -replace $line,"pear = amazing"} | Set-Content c:\temp\test.txt

}