sourcetip

파워셸에서 regex backreference/match 값을 추출하는 방법은 무엇입니까?

fileupload 2023. 9. 15. 21:17
반응형

파워셸에서 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

> $nullTrue가 출력에 기록되는 것을 억제할 뿐입니다.(제거해 보십시오.)지금은 이름이 기억나지 않는 똑같은 일을 하는 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 }

더 잘 작동하는 선택 문자열에 대한 훨씬 더 간단한 대안이 있습니다.

파워셸에서,

  1. $sample="blah blah subject=THIS.IS.TEST.DATA, blah blah blah"
  2. $sample -match "subject=([A-Z\.]+),"
  3. $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

반응형