저는 지난 몇 년간 이름을 잘못 지은 TV 쇼 DVD 립의 이름을 바꾸기 위해 Mac OS X 10.6에서 bash 쉘 스크립트(Automator Action으로 호출됨)를 작성하려고 합니다. 파일 이름에서 텍스트의 일부를 제거하고 싶습니다. 파일 이름에 항상 표시되는 특정 문자 계열 뒤에 나타나는 텍스트를 제거하고 싶습니다. 하지만 알려진 일련의 문자 앞이나 뒤에 얼마나 많은 문자가 나타날지 모르겠습니다. 또한 앞이나 뒤의 텍스트에 마침표나 대시가 여러 개 포함되어 있는지도 모르겠습니다. 다음 예가 도움이 될 수 있습니다.
빅뱅이론.S01E01.xxxxxxxxxxxx.mp4
각 파일에는 항상 SxxExx 형식의 문자열이 포함되어 있다는 것을 알고 있습니다. 여기서 x는 항상 숫자입니다. 하지만 숫자가 어떻게 될지는 모르겠습니다. SxxExx 문자열과 파일 확장자를 포함한 파일 이름을 얻고 싶지만 다른 모든 것을 제거하고 싶습니다. 따라서 위의 예에서는 다음과 같이 끝납니다.
빅뱅이론 S01E01.mp4
bash의 내장 문자열 교체 명령을 사용해 보았습니다. expr index 명령이 SxxExx 문자열의 시작점을 제공할 것이라고 생각한 다음 ${filename:offset:length}를 사용하여 필요한 파일 이름의 일부만 추출할 수 있습니다(확장자를 이미 알고 있으므로 다시 사용할 수 있습니다). 추출하세요). 그러나 OS X 버전의 expr에는 인덱싱 기능이 포함되어 있지 않은 것 같습니다. 이전에는 Basic과 LotusScript로만 스크립트를 작성했습니다. 이러한 환경에서는 "Like", "Instr" 또는 "Mid"와 같은 명령을 사용하는 것이 매우 쉽습니다. 하지만 bash에서는 그것을 알아낼 수 없습니다. 정규식을 사용하여 파일 이름에서 "SxxExx" 하위 문자열을 찾는 방법을 알아내려고 몇 시간 동안 인터넷 검색을 했지만 알 수 없습니다. 똑똑한 UNIX 스크립터가 나를 도와줄 수 있기를 바랍니다!
답변1
이 시도:
newname=`echo "$filename" | sed -e 's/\(S[0-9][0-9]E[0-9][0-9]\).*\.mp4/\1.mp4/'`
정규 표현식은 다음과 같습니다:
- 그룹 시작( \( )
- SXXXEXX와 일치합니다. 여기서 X는 0에서 9 사이의 숫자입니다.
- 터미널 그룹(\))
- 모든 문자와 일치합니다(개행 제외).
- 명시적인 문자열(.mp4)과 일치
대체 표현식에서:
- 첫 번째 그룹( \1 )에서 일치하는 문자열로 바꿉니다.
- 명시적 문자열( .mp4 )로 교체
답변2
파일 이름 목록과 file-list
파일 내의 경로가 있다고 가정하고 다음을 시도하십시오.
while IFS= read -r path; do
newpath=$(printf '%s\n' "$path" |
sed 's/\(.*S[0-9]*E[0-9]*\.\).*\.\([^.]*\)$/\1\2/')
echo mv -- "$path" "$newpath"
done <file-list
사용된 정규식의 의미 sed
및 예시 입력과의 비교"The.Big.Bang.Theory.S01E01.xxxxxxxxxxx.mp4"
\( start of group 1
.* The.Big.Bang.Theory. any sequence of characters
S[0-9]* S01 a capital S followed by 0 or more digits
E[0-9]* E01 a capital E followed by 0 or more digits
\. . a dot
\) end of group 1
.* xxxxxxxxxxx any sequence of characters
\. . a dot
\( start of group 2
[^.]* mp4 a sequence of 0 or more non-dot characters
\) end of group 2
$ end of line
출력에서 문자열은 \1\2
"output group1 다음에 group2(따라서 제거됨 xxxxxxxxxxx.
) 를 의미합니다.
만족스러우면 삭제하세요 echo
.