programing

PowerShell의 Get-Content, Regex 및 Set-Content 다음에 모든 새로운 라인이 삭제되는 이유는 무엇입니까?

mailnote 2023. 8. 19. 10:32
반응형

PowerShell의 Get-Content, Regex 및 Set-Content 다음에 모든 새로운 라인이 삭제되는 이유는 무엇입니까?

변수에 파일 템플릿을 로드하고 변수 내의 데이터를 수정한 후 변수에서 새 위치로 수정된 템플릿을 출력하고 싶습니다.

문제는 PowerShell이 내 템플릿에서 새 줄을 제거하고 있다는 것입니다.

입력 파일(템플릿 파일)에는 수정된 버전의 수신자가 유닉스 기반 시스템이므로 출력에도 필요한 유닉스 줄 끝이 있습니다.

다음 코드가 하나의 라이너로 연결됩니다.

[String] $replacement = "Foo Bar"
[String] $template = Get-Content -Path "$pwd\template.sh" -Encoding UTF8
$template = $template -replace '<REPLACE_ME>', $replacement
$template | Set-Content -Path "$pwd\script.sh" -Encoding UTF8

템플릿 입력:

#!/bin/sh
myvar="<REPLACE_ME>"
echo "my variable: $myvar"
exit 0

결과:

#!/bin/sh myvar="Foo Bar" echo "my variable: $myvar" exit 0

에 있는 것 .LF여기서 하나의 단순 공백으로 대체됩니다.마지막으로 스크립트의 마지막에 추가된 것이 있습니다.CR LF템플릿 파일에 없는 파일입니다.

하고 더의 추가를 할 수 요?CR LF) 마지막 스크립트로 끝나는 줄이 잘못되었습니까?

$replacement .[string]PowerShell은 이 과제를 통해 이를 추론할 것입니다.

$template 변수,[string]사실은 틀렸습니다.기적으로본,Get-Content문자열 하나 대신 문자열 배열(예: 줄)을 제공합니다.

하지만 사실 여러분은 애초에 입력을 줄로 나누고 싶지도 않습니다.Set-Content또는Out-File배열을 입력으로 보고 공백으로 조인합니다.

용사를 합니다.-RawGet-Content합니다. 부분도 됩니다. 이렇게 하면 줄 끝 부분도 반환됩니다(예:LF(Linux 파일의 경우)는 그대로 유지됩니다.

$replacement = "Foo Bar"
$template = Get-Content -Path "$pwd\template.sh" -Encoding UTF8 -Raw
$template = $template -replace '<REPLACE_ME>', $replacement
Set-Content -Path "$pwd\script.sh" -Value $template -Encoding UTF8

PowerShell은 모든 UTF-8 파일을 BOM으로 저장합니다.이 작업을 수행하지 않으려면 다른 유틸리티를 사용하여 파일을 작성해야 합니다.

$UTF8_NO_BOM = New-Object System.Text.UTF8Encoding $False

$replacement = "Foo Bar"
$template = Get-Content -Path "$pwd\template.sh" -Encoding UTF8 -Raw
$template = $template -replace '<REPLACE_ME>', $replacement
[System.IO.File]::WriteAllText("$pwd\script.sh", $template, $UTF8_NO_BOM)

주의:

  • 연산자: PowerShell 연산)-replace)는 어레이에서 자동으로 작동합니다.$x -replace "search", "replacement"$x의 모든 멤버(단일 문자열 또는 배열)에 대해 대체 작업을 수행합니다.
  • 권장 판독값: PowerShell Set-Content와 Out-File의 차이점은 무엇입니까?

-raw 대신 -delimiter "'n" 옵션을 사용합니다.-raw 옵션은 전체 내용을 단일 문자열로 읽거나 반환하지만, 새 줄 문자를 보존하지만 헤더/첫 번째 줄 건너뛰기 또는 빈 줄 건너뛰기 등과 같이 내용을 조작해야 하는 경우에는 유용하지 않습니다.

내용 가져오기 - 배경 정보:

기본적으로,Get-Contentcmdlet은 컨텐츠를 한 줄씩 읽고 반환합니다. 즉, 파이프를 연결하는 경우Set-Content또는Add-Content각 줄(읽는 중)을 출력 파일에 즉시 기록 - 새 줄 문자가 보존되고 예상대로 기록됩니다. 예:

Get-Content $inputFile | Set-Content $outputFilePath 

그러나 전체 내용(읽기)을 변수($variable이라고 함)에 저장하면 변수는 구분자/ 구분자 없이 단일 문자열 배열만 수신합니다(기본값). 즉, 파일을 읽을 때 줄 바꿈 문자가 손실됩니다(사용).Get-Content) 를 사용할 수 있습니다.-delimiter새 줄 문자('n')를 지정하는 옵션. 이 문자는 보존되고 $165에 기록/수정됩니다. 예:

Get-Content -Delimiter "`n" $fileToRead

HTH.

제 생각에 당신은 그것을 사용해야 할 것 같습니다.-Raw로 바꾸다.Get-Content파일을 단일 문자열로 로드하려면:

[String] $replacement = "Foo Bar"
[String] $template = Get-Content -Path "$pwd\template.sh" -Encoding UTF8 -Raw
$template = $template -replace '<REPLACE_ME>', $replacement

Windows 줄 끝이 스크립트의 끝에 추가되는 것을 멈추려면 이것을 사용해야 한다고 생각합니다.파일을 쓰는 NET 방법:

[io.file]::WriteAllText("$pwd\template.sh",$template)

기본적으로 PowerShell은 입력을 파일의 각 줄에 대한 문자열 배열로 변환하려고 시도합니다.유닉스 줄이 끝나기 때문에 이것을 성공적으로 하지 못했지만 그 후에 새로운 줄 문자를 제거하고 있다고 생각합니다.

PowerShell 3.0에는 이제 Raw라는 새로운 동적 매개 변수가 있습니다.지정하면 Get-Content는 줄 바꿈 문자를 무시하고 파일의 전체 내용을 한 문자열로 반환합니다.원시는 동적 매개 변수이며 파일 시스템 드라이브에서만 사용할 수 있습니다.

사용하고 있었습니다.Get-Content-Tail당신이 특정할 수 없는 것은-Raw동시에, 하지만 저는 운이 좋았습니다.Out-String그래서, 당신의 경우:

$template = Out-String -InputObject $( Get-Content -Path "$pwd\template.sh" -Encoding UTF8 -Raw)

아니면, 꼬리에 관심이 있다면:

$template = Out-String -InputObject $(Get-Content -Path "$pwd\template.sh" -tail 4)

언급URL : https://stackoverflow.com/questions/47512603/why-are-all-newlines-gone-after-powershells-get-content-regex-and-set-content

반응형