나는 cygwin에서 이름 바꾸기 도구의 Perl 구현을 가지고 놀았고 마침내 cpan에서 설치하여 작동하게 만들었습니다.
나는 오랫동안 이 작업을 수행하지 않았기 때문에 정규식 작업에 약간 녹슬었습니다.
기본적으로 양식 폴더의 이름을 바꾸고 싶습니다.
[2022-10-10] This is a Test - This is a Test (some stuff) [393933939339]
또는
[2022] This is a Test - This is a Test (some stuff) [393933939339]
내용을 처음 []
부터 끝까지 이동하여 다음과 같이 보이도록 합니다.
This is a Test - This is a Test (some stuff) [393933939339] [2022-10-10]
또는
This is a Test - This is a Test (some stuff) [393933939339] [2022]
위치 매개변수를 사용하여 이 작업을 수행하는 방법을 알아냈지만 패턴 일치를 사용하여 수행하는 데 문제가 있습니다.[]
rename -n 's/^(.{12})(.*)$/$2 $1/'
이는 전체 날짜가 있는 폴더에 대해 수행되지만 연도만 포함된 폴더에 대해서는 수행되지 않습니다. 이상적으로는 이 모든 것을 처리하는 하나의 표현을 원합니다.
[]가 연산자로 간주되어 어떤 식으로든 이스케이프해야 할 수도 있다는 사실로 인해 이것이 복잡해질 수 있다고 생각합니다.
도움을 주시면 감사하겠습니다.
답변1
[]가 연산자로 간주되어 어떤 식으로든 이스케이프해야 할 수도 있다는 사실로 인해 이것이 복잡해질 수 있다고 생각합니다.
정확히. RE에서 문자를 이스케이프하는 표준 방법은 문자 앞에 백슬래시를 붙이는 것입니다 \
. 그래서,
rename -n 's/^(\[.*?])\s*(.*)/$2 $1/s' '['*
되었습니다존경받는패턴 대체의 후행 수정자를 포함해야 합니다 s
. 이렇게 하면 패턴이 개행 문자를 문자로 일치시킬 수 있기 때문입니다(결국 파일 이름에서는 유효합니다). 또는 as 파일 이름 패턴을 사용하여 변환할 수 있는 파일 세트로 간주되는 파일 세트를 제한하십시오(이것은 -v
쉘에 의해 전달되고 유효한 인수 옵션으로 처리되는 등으로 시작하는 파일 이름을 무시합니다).rename
'['*
./*
답변2
나는 무엇을 할 것인가:
$ rename -n 's/^(\[.*?\])(.*)/$2 $1/' *393933939339*
rename([2022] This is a Test - This is a Test (some stuff) [393933939339], This is a Test - This is a Test (some stuff) [393933939339] [2022])
정규식 일치는 다음과 같습니다.
마디 | 설명하다 |
---|---|
^ |
스트링 앵커의 시작 |
( |
\1로 그룹화 및 캡처: |
\[ |
[ |
.*? |
\n을 제외한 모든 문자(0회 이상(가능한 한 적게 일치)) |
\] |
] |
) |
\1 끝 |
( |
\2로 그룹화 및 캡처: |
.* |
\n을 제외한 모든 문자(0회 이상(최대한 많이 일치)) |
) |
\2 끝 |