파워셸에서 regex backreference/match 값을 추출하는 방법은 무엇입니까?
데이터 라인이 포함된 텍스트 파일이 있습니다.다음 파워셸 스크립트를 사용하여 관심 있는 행을 추출할 수 있습니다.
select-string -path *.txt -pattern "subject=([A-Z\.]+),"
몇 가지 예시적인 데이터는 다음과 같습니다.
blah blah subject=THIS.IS.TEST.DATA, blah blah blah
제가 원하는 것은 주제의 실제 내용(즉, "THIS")만을 추출할 수 있는 것입니다.IS.TEST.DATA" 문자열).나는 이것을.
select-string -path *.txt -pattern "subject=([A-Z\.]+)," | %{ $_.Matches[0] }
그러나 "Matches" 속성은 항상 null입니다.내가 뭘 잘못하고 있는 거지?
당신의 버전이 왜 작동하지 않는지 모르겠습니다.그건 작동할 거야.여기 작동하는 추한 버전이 있습니다.
$p = "subject=([A-Z\.]+),"
select-string -path *.txt -pattern $p | % {$_ -match $p > $null; $matches[1]}
설명:
-match
는 정규식 매칭 연산자입니다.
>"foobar" -match "oo.ar"
True
그> $null
True가 출력에 기록되는 것을 억제할 뿐입니다.(제거해 보십시오.)지금은 이름이 기억나지 않는 똑같은 일을 하는 cmdlet이 있습니다.
$matches
는 마지막의 결과를 보유하는 마법 변수입니다.-match
작동.
PowerShell V2 CTP3에서는 Matchs 속성이 구현됩니다.따라서 다음이 작동합니다.
select-string -path *.txt -pattern "subject=([A-Z\.]+)," | %{ $_.Matches[0].Groups[1].Value }
또 다른 옵션이 있습니다.
gci *.txt | foreach { [regex]::match($_,'(?<=subject=)([^,]+)').value }
더 잘 작동하는 선택 문자열에 대한 훨씬 더 간단한 대안이 있습니다.
파워셸에서,
$sample="blah blah subject=THIS.IS.TEST.DATA, blah blah blah"
$sample -match "subject=([A-Z\.]+),"
$matches[1]
당신이 찾는 서브스트링이 있을 겁니다
Windows 10.0.16299 버전에서 작동합니다.
다른 모든 답변에서 많은 것을 배웠기 때문에 다음 줄을 사용하여 원하는 것을 얻을 수 있었습니다.
gci *.txt | gc | %{ [regex]::matches($_, "subject=([A-Z\.]+),") } | %{ $_.Groups[1].Value }
한 줄에 한 번만 regex를 실행하고 명령 프롬프트에 입력하니 여러 줄의 코드가 없는 것이 좋았습니다.
입력하는 코드의 문제는 select-string이 실제 regex 개체를 전달하지 않는다는 것입니다.대신 실제 정규식 일치 정보가 없는 MatchInfo라는 다른 클래스를 전달합니다.
regex를 한 번만 실행하고 싶다면 자체적인 기능을 롤로 해야 하는데 너무 어렵지 않습니다.
function Select-Match() {
param ($pattern = $(throw "Need a pattern"),
$filePath = $(throw "Need a file path") )
foreach ( $cur in (gc $filePath)) {
if ( $cur -match $pattern ) {
write-output $matches[0];
}
}
}
gci *.txt | %{ Select-Match "subject=([A-Z\.]+)," $_.FullName }
Select-String 명령은 "string" 변수가 아니라 MatchInfo 변수를 반환하는 것 같습니다.저는 포럼과 공식 웹사이트에서 몇 시간 동안 이 사실을 알아냈지만 운이 없었습니다.아직 정보를 수집하고 있습니다.이를 해결할 수 있는 방법은 예제에서 Select-String에서 반환된 결과를 유지하기 위해 문자열 변수를 명시적으로 선언하는 것입니다.
[string] $foo = select-string -path *.txt - "subject=([A-Z.]+)",
$foo 변수는 이제 MatchInfo 개체가 아닌 문자열입니다.
도움이 되길 바랍니다.
ps5 파워쉘 버전 5 문자열 조작
문자열에서 7자리와 일치하는 또 다른 변형
echo "123456789 hello test" | % {$_ -match "\d{7}" > $null; $matches[0]}
반품 : 1234567
언급URL : https://stackoverflow.com/questions/614651/how-do-you-extract-the-value-of-a-regex-backreference-match-in-powershell
'sourcetip' 카테고리의 다른 글
XPath로 Java에서 네임스페이스를 사용하여 XML을 쿼리하는 방법은 무엇입니까? (0) | 2023.09.15 |
---|---|
get_posts를 사용하여 X(ID)보다 큰 게시물을 가져오는 방법 (0) | 2023.09.15 |
MySQL - 0이 아닌 MIN 찾기 (0) | 2023.09.15 |
스프링 - 프로그래밍 방식으로 콩 세트 생성 (0) | 2023.09.15 |
MySQL보다 SQLite가 더 빠릅니까? (0) | 2023.09.15 |