programing

PowerShell을 사용하여 서브스트링 추출

goodsources 2023. 4. 21. 20:49
반응형

PowerShell을 사용하여 서브스트링 추출

PowerShell을 사용하여 서브스트링을 추출하려면 어떻게 해야 합니까?

이 끈이 있는데...

"-----start-------Hello World------end-------"

추출해야 하는데...

Hello World

그것을 하는 가장 좋은 방법은?

-match연산자는 정규식을 테스트하고, 이를 매직 변수와 결합합니다.$matches결과를 얻기 위해

PS C:\> $x = "----start----Hello World----end----"
PS C:\> $x -match "----start----(?<content>.*)----end----"
True
PS C:\> $matches['content']
Hello World

regex-y에 대해 궁금한 점이 있을 경우 다음 사이트를 확인하십시오.http://www.regular-expressions.info

Substringmethod는 시작 위치와 길이에 따라 원래 문자열에서 특정 문자열을 추출하는 방법을 제공합니다.인수가 1개만 지정되면 해당 인수가 시작 위치로 간주되고 나머지 문자열이 출력됩니다.

PS > "test_string".Substring(0,4)
Test
PS > "test_string".Substring(4)
_stringPS >

하지만 이게 더 쉬워요

 $s = 'Hello World is in here Hello World!'
 $p = 'Hello World'
 $s -match $p

마지막으로 디렉토리에서 .txt 파일만 선택하고 "Hello World"를 검색하려면 다음 절차를 따릅니다.

dir -rec -filter *.txt | Select-String 'Hello World'

이것이 효율적인지는 모르겠지만 PowerShell의 문자열은 Python과 유사한 방법으로 어레이 인덱스 구문을 사용하여 참조할 수 있습니다.

첫 번째 글자가 에 의해 언급되고 있기 때문에 완전히 직관적인 것은 아닙니다.index = 0단, 다음과 같습니다.

  • 오류를 생성하지 않고 문자열보다 긴 두 번째 인덱스 번호 허용
  • 역방향으로 서브스트링 추출
  • 문자열 끝에서 하위 문자열 추출

다음은 몇 가지 예입니다.

PS > 'Hello World'[0..2]

결과(명확성을 위해 포함된 인덱스 값 - 출력에 생성되지 않음):

H [0]
e [1]
l [2]

어떤 것이 더 유용하게 쓰일 수 있는가?-join '':

PS > 'Hello World'[0..2] -join ''
Hel

서로 다른 인덱스를 사용하여 얻을 수 있는 몇 가지 흥미로운 효과가 있습니다.

전송

두 번째보다 작은 첫 번째 인덱스 값을 사용하면 예상대로 하위 문자열이 앞으로 방향으로 추출됩니다.이번에는 두 번째 인덱스 값이 문자열 길이를 크게 초과하지만 오류는 없습니다.

PS > 'Hello World'[3..300] -join ''
lo World

다음과는 다릅니다.

PS > 'Hello World'.Substring(3,300)
Exception calling "Substring" with "2" argument(s): "Index and length must refer to a location within
the string.

거꾸로

첫 번째 인덱스 값보다 작은 두 번째 인덱스 값을 지정하면 문자열은 반대로 반환됩니다.

PS > 'Hello World'[4..0] -join ''
olleH

종료부터

음수를 사용하면 문자열 끝의 위치를 참조할 수 있습니다.추출하다'World', 마지막 5글자를 사용합니다.

PS > 'Hello World'[-5..-1] -join ''
World
PS> $a = "-----start-------Hello World------end-------"
PS> $a.substring(17, 11)
         or
PS> $a.Substring($a.IndexOf('H'), 11)

$a.Substring(argument1, argument2) --> 여기argument1= 원하는 알파벳 시작 위치 및argument2= 출력으로 원하는 서브스트링의 길이.

여기 17은 알파벳 색인입니다.'H' Hello World까지 에 두 합니다.

Matt의 답변을 바탕으로 새로운 라인에서 검색하여 쉽게 수정할 수 있는 답변이 있습니다.

$String="----start----`nHello World`n----end----"
$SearchStart="----start----`n" #Will not be included in results
$SearchEnd="`n----end----" #Will not be included in results
$String -match "(?s)$SearchStart(?<content>.*)$SearchEnd"
$result=$matches['content']
$result

--

메모: 파일에 대해 실행할 경우 Get-Content는 단일 문자열이 아닌 배열을 반환합니다.이 문제를 해결하려면 다음을 수행합니다.

$String=[string]::join("`n", (Get-Content $Filename))

다른 해결법

$template="-----start-------{Value:This is a test 123}------end-------"
$text="-----start-------Hello World------end-------"

$text | ConvertFrom-String -TemplateContent $template

문자열이 복잡하지 않기 때문에 RegEx 문자열을 추가할 필요가 없습니다.간단한 성냥으로 효과를 볼 수 있다.

$line = "----start----Hello World----end----"
$line -match "Hello World"
$matches[0]
Hello World

$result = $matches[0]
$result
Hello World

로그 파일에서 몇 줄을 추출해야 했고, 이 게시물이 문제 해결에 도움이 되었기 때문에 여기에 추가하려고 합니다.다른 사용자가 여러 줄을 추출해야 하는 경우 스크립트를 사용하여 해당 문자열과 일치하는 단어의 인덱스를 가져오고("루트"를 검색 중) 모든 줄의 내용을 추출할 수 있습니다.

$File_content = Get-Content "Path of the text file"
$result = @()

foreach ($val in $File_content){
    $Index_No = $val.IndexOf("Root")
    $result += $val.substring($Index_No)
}

$result | Select-Object -Unique

건배!

언급URL : https://stackoverflow.com/questions/2988880/extract-a-substring-using-powershell

반응형