我以前从来没有使用过powershell,谷歌也没有给我确切的答案。我希望你们能帮助我。我需要找到目录(包括子目录)中包含2行的所有文件:
aaa aaa
bbb bbb并将第二行替换为ccc
如果行bbb bbb没有紧跟在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
}
}我认为这个代码几乎可以工作,除非文件有两次"bbb bbb":一次紧跟在"aaa aaa“之后,另一次没有"aaa aaa”。这两行都会被替换,我只需要第一行是replaced.Is,有什么方法可以修复它吗?有更多经验的人能告诉我我是否遗漏了什么吗?有没有更简单/更短的解决方案来满足我的需求?我在powershell中见过很多整洁的单行解决方案。我的案子有没有类似的东西?谢谢
发布于 2012-12-15 00:58:56
这是一个批处理解决方案:)
@echo off
setlocal enabledelayedexpansion
cd C:\folder
set aaa=false
for /r C:\folder %%a in (*) do (
for /f "tokens=1,2 delims= " %%x in (%%a) do (
if "!aaa!"=="true" (
if "%%x"=="bbb" if "%%y"=="bbb" (
echo ccc ccc >>temp.txt
del %%a /f /q
ren temp.txt %%~nxa
set aaa=false
)
) else (
if "%%x"=="aaa" if "%%y"=="aaa" set aaa=true
echo %%x %%y >>temp.txt
)
)
)https://stackoverflow.com/questions/13882047
复制相似问题