2016-11-18 2 views
2

다음과 같은 비디오 파일이 있습니다. VideoName_s01e01.mp4 시즌 및 에피소드가 변수 인 곳입니다. 나는 s??e?? 사이에 밑줄 ("_")를 추가 할. 이 실제로 내 파일 VideoName_s[0-9]_e[0-9].mp4 이름을 변경기존 파일 이름을 다시 포맷하여 파일 이름 바꾸기 - 바꾸기 연산자로 사용되는 대체 문자열의 자리 표시 자

GCI $path -filter '*_s??e??*' -rec | Ren -new { $_.name -replace '_s[0-9][0-9]', '_s[0-9]_[0-9]_' } -passthru  

: 나는 목적으로 이름을 변경하기위한 을 사용하고있다

, 나는 출발점이있다.

기본적으로,이 문자 s??e??을 찾고 난 그냥 그들에게 대체 섹션에 변수를 만드는 방법을 알고하지 않습니다.

나는 가장 좋은 방법이 될 것이라고 생각 :
  1. e??s??의 위치를 ​​(의이 X를 부르 자) 찾을 수 있습니다.
  2. X-3에서 문자열을 분할합니다.
  3. 는 중간에 "_"와 문자열을 연결.

답변

4

Martin Brandl's answer provides an elegant and effective solution하지만 더 깊은 파고 가치 :

PowerShell에서의 -replace 연산자 (... -replace <search>, <replace>) :

    ,
  • 는 먼저 피연산자 <search> 검색 식으로서 정규식) 걸리고, 불변 전역은 (모든 일치) 발견 일치한다.

  • 은 제 2 피연산자 <replace>에서 정규 표현식이 캡처 한 (및 캡처하지 못한) 참조 문자열 (대체 문자열)을 지원합니다. <replace>에서 지원 정규식 캡처를 참조하기위한

은 "대체 언어"자체 하지 정규 표현식입니다 - 일치가 지원됩니다, 거기에 정규 표현식 매칭의 결과에 대한 참조 만 발생하지 않습니다.

특히,

편의를 위해, 여기에 (추가 강조와 주석 위에 링크 된 페이지에서 발췌) <replace>에서 지원되는 참조입니다 :

  • $number (예를 들어, $1) ... 대체 문자열에서 number으로 식별되는 캡처 그룹과 일치하는 마지막 부분 문자열을 포함합니다. 여기서 number은 10 진수 값입니다.

    주석
    • : 당신의 정규식에서 괄호 부분 식 (...) 포함

      • 는 암시 적으로 이름 캡처 (캡처) 그룹을 만듭니다. $1이 정규식의 첫번째 이름이 그룹이 촬영 된 것을 참조하도록 이름 그룹이 인덱스, 1에서 시작하여 참조하는, 두 번째 캡처 무엇을 $2, ...
        따라서, 어떤 마틴의 대답에 처음 ([0-9]{1,2}), 캡처 된 s$1에, 그리고 e 이후의 두 번째 이름없는 그룹 $2에 반영됩니다. 개수 동음위한

      • ${number} (예 ${1})은 또한 (예컨대, ${1}000을 사용 000 가령 다음 $1 경우에도 인식되는지 확인하는)지지된다.

    • ${name}

  • 은 ... 대체 문자열에서 (?<name>...)에 의해 지정되는 라는 이름의 그룹 일치 마지막 문자열을 포함합니다.

  • $$은 ... 대체 문자열에서 문자 하나 "$"을 포함합니다.

  • $& ... 대체 문자열에 전체 일치 사본이 포함됩니다.

  • $`은 ... 전에 대체 문자열에서 일치을 입력 문자열 의 모든 텍스트를 포함합니다.

  • $'은 ... 대체 문자열에서 경기 후 입력 문자열 의 모든 텍스트를 포함합니다.

  • $+합니다 ... 마지막 그룹이 대체 문자열에서 촬영이 포함되어 있습니다. [이 마지막 그룹의 특정 인덱스를 알 필요가 없습니다.]

  • $_

    은 ... 대체 문자열에서 전체 입력 문자열을 포함합니다.

    마지막으로

, 그주의 :

  • 그것은 정규식과 대체 문자열 모두 '...'를 사용하는 것이 일반적으로 바람직 입니다. 즉, 작은 따옴표 문자열을 사용하고 비 확장 (비 보간)이므로 $ -prefixed 토큰의 PowerShell 자체 앞뒤 확장과 혼동하지 마십시오. 당신이 PowerShell을 변수를 포함해야하는 경우
    , 당신은 두 가지 옵션이 있습니다

    • 사용 "..." (확장 문자열)과 정규식 엔진에 대한 의미 ` -escape $ 인스턴스; 예를 들어, 다음 예제 `$1 :
      'abc' -replace '(a)', "[`$1]-$HOME-", [a]-C:\Users\jdoe-bc
    • 같은 것이 문자열 연결 (+)를 사용하여 문자 조각과 변수 참조에서 문자열을 구축 산출; 예컨대 : 입력 문자열이 여러 경기를 포함, 그래서 만약 'abc' -replace '(a)', ('[$1]-' + $HOME + '-')
  • -replace 변함없이, 세계적으로 일치
    의 교체 위 경기에 적용됩니다.

+1

다른 제안, 더 나은 솔루션입니다 ... –

1

-replace이 아니라 입니다. 따라서 대체품을 다음으로 변경해야합니다.

-replace '_s([0-9]{1,2})e([0-9]{1,2})', '_s$1_e$2_' 
1

정규식 학습을 위해 regex101.com을 적극 권장합니다.

"VideoName_s01e01.mp4" -replace '(.*s)(\d+)(e.*)', '$1$2_$3' 

가 제공합니다 :

이런 식으로 뭔가를 작동 할 수

VideoName_s01_e01.mp4 
0

정규식 내가 내가 두 번 upvote에 수 있으면 좋겠다 형식화하는 번호와 사용 템플릿

$exampleoffile = @" 
namev1_s01e01.mp4 
namvev2_s03e02.mp4 
VideoName_s20e15.mp4 
VideoName_s15e1.mp4 
VideoName_s1e16.avi 
VideoName_s1e23.mv 
"@ 

[email protected]" 
{file*:{prefix:Test1}_s{season:01}e{episode:01}{extension:.mp4}} 
{file*:{prefix:1xxx}_s{season:100}e{episode:5}{extension:.mp4}} 
{file*:{prefix:yyy3}_s{season:10}e{episode:02}{extension:.havi}} 
"@ 



$exampleoffile | ConvertFrom-String -TemplateContent $template | 
% { "{0}_{1:D2}_e{2:D2}{3}" -f $_.file.prefix, [int]$_.file.season, [int]$_.file.episode, $_.file.extension }