我以前从未使用过 powershell,而且 Google 并没有给出我所需要的答案。我希望你们能帮助我。我需要找到目录(包括子目录)中包含 2 行的所有文件:
aaa aaa
bbb bbb
并将第二行替换为ccc
bbb bbb
如果 line没有紧随其后,则不应发生替换aaa aaa
。
这是我到目前为止所拥有的:
$line3 = "aaa[ ]*aaa[ ]*bbb[ ]*bbb"
Get-ChildItem -exclude *.bak -recurse *.txt | Where-Object {$_.Attributes -ne "Directory"} |
ForEach-Object {
Copy-Item $_ "$($_).bak";
$wholeFile = [IO.File]::ReadAllText("$_");
$wholeFile = $wholeFile.replace("`n", " ");
$wholeFile = $wholeFile.replace("`r", " ");
$temp3 = $wholeFile | Select-String -pattern $line3 -quiet;
if(($temp3 -eq "True")){
(Get-Content $_) -replace "bbb[ ]*bbb", "ccc" | Set-Content -path $_;
}
else{
echo failed
}
}
我认为这段代码几乎可以工作,除非一个文件有 2 次出现“bbb bbb”:一个紧跟在“aaa aaa”之后,另一个没有“aaa aaa”。两条线都会被替换,我只需要替换第一条线。有什么办法可以解决吗?如果我错过了什么,有更多经验的人可以告诉我吗?我需要什么更简单/更短的解决方案?我在 powershell 中看到了很多简洁的单行解决方案。我的情况有类似的情况吗?谢谢