[powershell] 파일에서 모든 문자열을 PowerShell로 바꾸려면 어떻게해야합니까?

PowerShell을 사용 [MYID]하여 주어진 파일에서 발생하는 모든 정확한 항목을로 바꾸고 싶습니다 MyValue. 가장 쉬운 방법은 무엇입니까?



답변

사용 (V3 버전) :

(Get-Content c:\temp\test.txt).replace('[MYID]', 'MyValue') | Set-Content c:\temp\test.txt

또는 V2의 경우 :

(Get-Content c:\temp\test.txt) -replace '\[MYID\]', 'MyValue' | Set-Content c:\temp\test.txt


답변

(Get-Content file.txt) |
Foreach-Object {$_ -replace '\[MYID\]','MyValue'}  |
Out-File file.txt

괄호 (Get-Content file.txt)는 다음과 같습니다.

괄호가 없으면 내용이 한 번에 한 줄씩 읽혀지고 파일 또는 세트 내용에 도달 할 때까지 파이프 라인을 따라 내려갑니다. 동일한 파일에 쓰려고 시도하지만 get-content에 의해 이미 열려 있고 오류. 괄호로 인해 콘텐츠 읽기 작업이 한 번만 수행됩니다 (열기, 읽기 및 닫기). 그런 다음에 만 모든 행을 읽을 때 한 번에 하나씩 파이프되고 파이프 라인의 마지막 명령에 도달하면 파일에 쓸 수 있습니다. $ content = content와 동일합니다. $ content | 어디 …


답변

다음 예제에서 볼 수 있듯이 File 클래스의 .NET과 정적 메서드를 사용하는 것이 좋습니다.

$content = [System.IO.File]::ReadAllText("c:\bla.txt").Replace("[MYID]","MyValue")
[System.IO.File]::WriteAllText("c:\bla.txt", $content)

이것은 Get-Content 와 같이 String-array 대신 단일 String으로 작업 할 수 있다는 이점이 있습니다 . 또한 대부분의 시간을 신경 쓸 필요없이 파일 인코딩 (UTF-8 BOM 등)을 처리합니다.

또한 메서드는 Get-Content를 사용하고 Set-Content로 파이프하는 알고리즘과 달리 줄 끝 (사용할 수있는 Unix 줄 끝)을 엉망으로 만들지 않습니다. .

그래서 나를 위해 : 몇 년 동안 깰 수있는 것들이 적습니다.

.NET 클래스를 사용할 때 잘 알려진 점은 PowerShell 창에서 “[System.IO.File] ::”을 입력하면 Tab키를 눌러 방법을 단계별로 수행 할 수 있다는 것입니다.


답변

위의 파일은 “하나의 파일”에 대해서만 실행되지만 폴더 내의 여러 파일에 대해서도 실행할 수 있습니다.

Get-ChildItem 'C:yourfile*.xml' -Recurse | ForEach {
     (Get-Content $_ | ForEach  { $_ -replace '[MYID]', 'MyValue' }) |
     Set-Content $_
}


답변

다음과 같이 시도해보십시오.

$path = "C:\testFile.txt"
$word = "searchword"
$replacement = "ReplacementText"
$text = get-content $path
$newText = $text -replace $word,$replacement
$newText > $path


답변

이것이 내가 사용하는 것이지만 큰 텍스트 파일에서는 느립니다.

get-content $pathToFile | % { $_ -replace $stringToReplace, $replaceWith } | set-content $pathToFile

큰 텍스트 파일에서 문자열을 바꾸고 속도가 중요한 경우 System.IO.StreamReaderSystem.IO.StreamWriter 사용을 살펴보십시오 .

try
{
   $reader = [System.IO.StreamReader] $pathToFile
   $data = $reader.ReadToEnd()
   $reader.close()
}
finally
{
   if ($reader -ne $null)
   {
       $reader.dispose()
   }
}

$data = $data -replace $stringToReplace, $replaceWith

try
{
   $writer = [System.IO.StreamWriter] $pathToFile
   $writer.write($data)
   $writer.close()
}
finally
{
   if ($writer -ne $null)
   {
       $writer.dispose()
   }
}

(위의 코드는 테스트되지 않았습니다.)

문서에서 텍스트를 바꾸는 데 StreamReader와 StreamWriter를 사용하는 더 우아한 방법이있을 수 있지만 좋은 출발점이 될 것입니다.


답변

Payette의 Windows Powershell in Action 에서 조금 알려졌지만 놀랍도록 멋진 방법을 찾았습니다 . $ env : path와 비슷한 변수와 같은 파일을 참조 할 수 있지만 중괄호를 추가해야합니다.

${c:file.txt} = ${c:file.txt} -replace 'oldvalue','newvalue'