검색 정규식의 일부를 유지하면서 이름 바꾸기 사용


8

아침,

내가 작업 해야하는 현재 프로젝트에는 나를 괴롭히는 이전의 명명 체계가있었습니다 ...

Base.v2.c
Base.v2a.c
Slider.v4a.h
Area.v2a.2.h

버전에서 "a"는 더 많은 작업이 필요한 "알파"버전을 식별하는 것으로 들었습니다. 프로젝트의이 단계에서 "a"를 제거하고 ".1"(v2a-> v2.1)로 바꿀 수 있습니다.

수동으로 수행하려는 작업 외에도 많은 파일이 있습니다.

rename 명령을 사용하여 모든 파일의 이름을 한 번에 바꿀 수 있다는 것을 알고 있지만 그렇게하는 방법에 문제가 있습니다. 내가 같은 것을 사용하면 :

rename 's/[0-9]a/.1/' *

그런 다음 버전 번호의 마지막 숫자를 잃게됩니다. 파일을 찾는 데 사용 된 정규식의 일부를 이름을 바꾸거나 다른 명령 줄 도구로 기억하는 방법이 있습니까? 따라서 '[0-9] a'에서 '[0-9] .1'은 1a에서 1.1로, 4a에서 4.1 등으로 변경됩니다.


나쁜 생각입니다. 일반적으로 v2a < v2 < 2.1. 다시 말해, 버전 2- 알파는 버전 뒤가 아니라 버전 2로 이어지는 버전을 나타냅니다. version 1.99또는 이와 유사한 것으로 이름을 바꾸는 것이 좋습니다 .
jpaugh

답변:


15

캡처 그룹을 사용할 수 있습니다 .

$ rename -n 's/(\d)a/$1.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h

또는 lookbehind를 사용할 수 있습니다 .

$ rename -n 's/(?<=\d)a/.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h

또는 lookbehind와 마찬가지로 길이가 0 인 assertion \K은 "이 시점까지 일치하는 모든 것을 잊어 버린다"는 의미입니다.

$ rename -n 's/\d\Ka/.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h

나는 \d대신에 더 짧은 것을 사용했습니다 [0-9]. 이 둘은 동일하지만 renameperl 스크립트이므로 Perl 호환 정규 표현식 (PCRE)의 구문을 이해합니다.

이것은 숫자 의 첫 번째 항목 다음에 만 변경 됩니다 a. 파일 이름에 따라 필요한 것일 수도 있고 아닐 수도 있습니다.

-n차종은 rename실제로 아무것도하지 않고 어떻게 할 것인지 보여줍니다. 예상대로 작동하는 것으로 확인되면 파일 이름을 실제로 변경하려면 제거하십시오.


8

이 방법으로 명령을 수정하십시오.

rename 's/([0-9])a/$1.1/' *
  • 대체 명령 s/<souce>/<replacement>/은 소스 문자열 (정규 표현식 일 수 있음)을 대체 문자열로 대체합니다.
  • 캡처 그룹 - 괄호로 묶 소스 문자열의 부분 : (regexp), (string), 등 연속 변수의 값으로 지정됩니다 : $1, $2, 등
  • 따라서 대체 문자열 내에서 변수 $1는 해당 값으로 확장되므로이 경우 regexp와 일치해야합니다 [0-9].
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.