2013-06-04 5 views
5

PowerShell에서 이름 바꾸기 스크립트를 만드는 데 많은 어려움을 겪고 있습니다. 상황 : "네 자리 숫자 - 텍스트 - 정크" 내가 에 이름을 변경하려는 "텍스트 (네 자리 숫자)"지금 ​​내가 만든PowerShell regex grouping

: 나는 다음과 같은 형식으로 명명 된 폴더가있는 디렉토리에서 일부 샘플 이름을 가진 디렉토리와 주위에 재생하려면 : - 흥미로운 - 엉터리 뭔가

2006 -

1996이 복사 - 에코 스크립트를 설정 내가 해봤

무시하고 자신의 이름은 시작하지만 정규 표현식이 마음에 들지 않습니다. 다음 코드는 인쇄 "1996 - 무엇인가"와 "2006 - 복사"

Get-ChildItem | Foreach-Object { if ($_.BaseName -match "(\d{4} - \w+ -*)") { echo $matches[0]}} 

및 인쇄 할이 하나의 "1996 - 흥미로운 - 뭔가 엉터리 \ n을()"와 "2006 -이 복사 - 무시 \ n() "

Get-ChildItem | Foreach-Object { echo ($_.BaseName -replace "(\d{4} - \w+ - *)"), "$2 ($1)"} 

어도비의 접근법이 리터럴 문자열"- "을 경계로 삼는 이유를 누가 말해 줄 수 있습니까? 이 전에 후행 공백을 트림하는 것입니다 -

Get-ChildItem | Foreach-Object { 
    if ($_.BaseName -match "(\d{4} - [^-]*)") { 
     echo $matches[0].TrimEnd() 
    } 
} 

참고 TrimEnd :

는 * 수정 * 감사 zespri, 내 문제를 해결 코드는

Get-ChildItem | Foreach-Object { 
if ($_.BaseName -match "(\d{4} - [^-]*)") { 
    Rename-Item $_ ($_.BaseName -replace "(\d{4}) - (.+)(?= -).*" ,'$2 ($1)') 
    } 
} 

답변

5

는 윌 당신을 위해이 일이 두 번째 대시.

예제가 작동하지 않는 이유는 다음과 같습니다. \ w +는 단어 문자와 일치하므로 "재미있는 것"내부의 공간과 일치하지 않습니다. *는 0 이상을 의미합니다. 따라서 - *는 0 개 이상의 대시와 일치합니다 (0 인 경우).

당신을 위해 작동 할 수 표현식을 작성하는 또 다른 방법은 다음과 같습니다 (?= -) 구조가이 회계 처리로이 경우 positive lookahead assertion 당신이 마지막에 여분의 공간을 정돈 할 필요가 없습니다 것입니다

Get-ChildItem | Foreach-Object { 
    if ($_.BaseName -match "(\d{4} - .+(?= -))") { 
     echo $matches[0] 
    } 
} 

왜냐하면 정규식 자체에서.

업데이트 1

변환 할 수정 된 항목 :

gci | %{ $_.BaseName -replace "(\d{4}) - (.+)(?= -).*" ,'$2 ($1)' } 
+0

그것은 예 일치하는 사람의 이름을 메아리를, 그 한 단계입니다 올바른 방향. 지금 그것으로 무언가를하십시오 : "뭔가 재미있는 (숫자)"로 다시 포맷하십시오. 나는 괄호 안에 추출하고 $ matches [0] .Groups [] la http://stackoverflow.com/questions/614651/how-do-you-extract-the를 통해 추출하려는 두 부분을 래핑하려고했습니다. - 값 - 중 - regex - 역 참조 - 일치하는 - powershell하지만 그것은 유효한 연산자가 아닙니다.또한 이름이 지정된 그룹과 이름이없는 그룹을 시도했지만 텍스트 전체가 아닌 다른 것을 얻을 수 없으며 빈 괄호 쌍이 정크가 따라옵니다. – Glader

+0

@Glader : 저는 올바른 방향으로 부드러운 전환이 충분할 것으로 기대했습니다. 이름을 다시 포맷하는 코드를 추가하기위한 답을 수정했습니다. –

+0

그래서 내가했지만 나는 내 인생을 위해 올바른 방법을 알아낼 수 없습니다. 첫 번째 정규식에 여러 or'ed 숯 요구 등을 추가하여 시도했지만 항상 뭔가 엉덩이에 날 물고있어. ^^ 고맙습니다. 원본 코드와 함께 작성한 코드를 업데이트했습니다. – Glader

0

이 시도 :

Get-ChildItem | 
    Select-String -Pattern '(\d{4})\s+-\s+(\w+(\s+\w+)*)\s+-.*' | 
    Foreach-Object { "$($_.Matches.Groups[2].Value) ($($_.Matches.Groups[1].Value))"