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
'programing' 카테고리의 다른 글
활성 시트.사용 범위.기둥.카운트 - 8 그게 무슨 뜻입니까? (0) | 2023.09.18 |
---|---|
Android 소프트키보드가 보일 때 전체 화면 모드에서 레이아웃을 조정하는 방법 (0) | 2023.09.18 |
PHP Mailer vs.스위프트 메일러? (0) | 2023.09.18 |
Yoast SEO 제목과 설명은 어디에 저장됩니까? (0) | 2023.09.18 |
Angularjs 약속이 단위 테스트에서 해결되지 않음 (0) | 2023.09.18 |