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
그Substring
method는 시작 위치와 길이에 따라 원래 문자열에서 특정 문자열을 추출하는 방법을 제공합니다.인수가 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
'programing' 카테고리의 다른 글
러스트의 스트링과 스트링의 차이점은 무엇일까. (0) | 2023.04.21 |
---|---|
경고: push.default가 설정되지 않았습니다.Git 2.0에서 암묵적인 값이 변화하고 있습니다. (0) | 2023.04.21 |
SQL NVARCHAR 및 VARCHAR 제한 (0) | 2023.04.21 |
bash 스크립트에서 루트로 실행 중인지 확인하는 방법 (0) | 2023.04.21 |
병합이 완료되지 않았습니다(MERGE_HEAD가 존재합니다). (0) | 2023.04.21 |