programing

PowerShell을 사용하여 파일의 줄을 바꾸는 방법은 무엇입니까?

muds 2023. 9. 18. 22:44
반응형

PowerShell을 사용하여 파일의 줄을 바꾸는 방법은 무엇입니까?

PowerShell을 사용하여 구성 파일의 줄 바꾸기를 읽으려고 합니다.때때로 이 스크립트는 작동하지만 대부분의 경우 줄을 대체하지는 않습니다.

(Get-Content D:\home\App_Config\Sitecore.config) `
    | %{ $_ -replace '  <setting name="Media.MediaLinkServerUrl" value=" "/>',' <setting name="Media.MediaLinkServerUrl" value="https://newurl.com"/>'} `
    | Set-Content D:\home\App_Config\Sitecore.config

다음을 시도해 봅니다.

$file = 'D:\home\App_Config\Sitecore.config'
$regex = '(?<=<setting name="Media\.MediaLinkServerUrl" value=")[^"]*'
(Get-Content $file) -replace $regex, 'https://newurl.com' | Set-Content $file

* 리Set-Content: Windows PowerShell에서는 시스템의 기존 싱글바이트 문자 인코딩(활성 ANSI 코드 페이지 기준)을 기본적으로 사용하므로 다음을 사용할 수 있습니다.-Encoding출력 파일의 인코딩을 명시적으로 제어합니다. PowerShell [Core] 6+는 기본적으로 BOM이 없는 UTF-8로 설정됩니다.

  • 또한 필수 사항을 참고합니다.(...)주위에Get-Content파이프라인이 다음과 같은 파일에 답장할 수 있는지 확인하기 위해 호출합니다.Get-Content에서 읽었습니다.
  • 문제의 오프닝 태그가 발생할 가능성이 있는 경우 (<setting ...>) 여러 줄에 걸쳐 있습니다.
    Get-Content -Raw $file(PSV3+) 전체 파일 내용을 하나의 문자열로 읽습니다(고맙습니다, 치명적인 개).
    없이.-Raw,Get-Content입력 라인을 나타내는 문자열 배열을 반환합니다.

기존 설정과 일치하는 정규 표현식 사용으로 인해 현재 내부에 있는 텍스트value="..."는 일치하므로 이 명령어는 반복적으로 실행되는 경우에도 작동합니다.

반대로, 당신이 시도한 효과적인 리터럴을 사용합니다 (... value=" "대체할 내용을 찾고 첫 번째 - 성공적 - 실행 후 해당 문자가 더 이상 일치하지 않으며 이후 실행은 영향을 미치지 않습니다.

위의 명령어는 교체에 대해 간소화된 접근 방식을 사용합니다.

  • (?<=<setting name="Media.MediaLinkServerUrl" value=")는 후방 주장입니다 ((?<=...)일치하지만 일치하는 부분은 캡처하지 않습니다. 오프닝까지 포함하여 부품을 찾습니다."대체할 가치가 있습니다. 해당 접두사를 대체할 부분의 일부로 만들지 않고도 말입니다.

  • [^"]*그런 다음 클로징을 포함하지 않고 전체 값을 일치시킵니다.". ([^"]는 () 이외의 다른 문자와 일치하는 문자 집합입니다.^) a",그리고.*는 이러한 문자의 임의의 (주로 비어 있는) 시퀀스를 찾습니다.

  • 따라서 regex는 값 자체만 캡처했기 때문에 대체 문자열로 지정하면 새 값만 지정할 수 있습니다.

다음과 같이 바꾸기 방법을 사용합니다.

$file = 'D:\home\App_Config\Sitecore.config'
$find = '  <setting name="Media.MediaLinkServerUrl" value=" "/>'
$replace = ' <setting name="Media.MediaLinkServerUrl" value="https://newurl.com"/>'

(Get-Content $file).replace($find, $replace) | Set-Content $file

이 기능은 나에게 효과가 있었습니다.

Infile 이후에 오는 것은 무엇이든 교체하려고 합니다.

기능:

function Write-FileContent {
        [cmdletBinding()]
        param(
            [parameter(Mandatory = $true)]
            [string]$FileToReplacePath,
            [parameter(Mandatory = $true)]
            [string]$TextToReplaceWith,
            [parameter(Mandatory = $true)]
            [string]$LineNumber,
            [parameter(Mandatory = $true)]
            [string]$TextToBeingWith        
        )
        $Read = Get-Content -Path $FileToReplacePath
        $Read | ForEach-Object { if ($_.ReadCount -eq $LineNumber) { $_ -replace "'$TextToBeginWith'=.+'", "$TextToReplaceWith" }   else { $_ } } | Set-Content $FileToReplacePath
    }

테스트 파라미터

$CsvFilePath="C:\msydatfgdfa.csv"
Write-FileContent -FileToReplacePath D:\test.txt -TextToReplaceWith "'$CsvFilePath'" -LineNumber 2 -TextToBeingWith "Infile"

PSPath 속성을 보존하는 예제는 set-content의 경로를 지정할 필요가 없습니다.

(Get-Content -raw input) | ForEach-Object {
    $_ -replace 111,222 |
    Add-Member NoteProperty PSPath $_.PSPath -PassThru
} | Set-Content -nonewline

언급URL : https://stackoverflow.com/questions/40679169/how-do-i-replace-a-line-in-a-file-using-powershell

반응형