sed를 사용하여 트랙 번호를 제거하여 여러 음악 파일의 이름을 바꾸고 있습니다. 그러나 정규식의 "+" 문자를 사용하는 sed의 동작이 혼란스럽습니다.
내가 하고 싶은 것:
for f in *\-[0-9]**; do echo "$f" | sed 's/\-[0-9]+/\-/g'; done
하지만 이는 예상대로 진행되지 않았습니다. 이 해결 방법은 다음 작업을 수행합니다.
for f in *\-[0-9]**; do echo "$f" | sed 's/\-[0-9][0-9]*/\-/g'; done
하지만 sed에서 "+"를 사용하면 어떤 문제가 있는지 알고 싶습니다. 어떤 아이디어가 있습니까?
답변1
+
확장된 정규식 수정자입니다. sed
하다기본 정규식기본적으로.
sed
표현식을 확장 정규식으로 구문 분석 하려면 .GNU를 .GNU sed -E
로 사용하면 sed
기본 정규식도 이해할 수 있습니다 .+
\+
그리고 패턴이 *\-[0-9]**
이상해 보이는데요. 이스케이프가 필요 하지 않으며 -
(셸 패턴이나 정규 표현식에서는 아님) 에서 globstar
사용 하지 않으면 bash
패턴 **
이 자체적으로 확장됩니다 . globstar
활성화되면 첫 번째 파일 이름 구성 요소(여기서 숫자) 에 포함된 모든 경로 이름 bash
*-[0-9]**
으로 확장 됩니다.-N
N
나는 당신이하고 싶은 것이 다음과 같다고 생각합니다 (정확하지는 않지만 파일 이름이 어떻게 생겼는지 모르겠습니다).
for name in *-[0-9][0-9]*; do
newname=${name%-*}
printf 'Would rename "%s" into "%s"\n' "$name" "$newname"
# mv "$name" "$newname"
done
이는 -NN
( 는 숫자)를 포함하는 현재 디렉토리의 N
모든 이름 과 일치합니다. 파일 이름의 마지막 항목에서 모든 내용을 제거 -
하고 파일 이름을 변경합니다(실제 이름 변경은 주석 처리됨).