sed - * 유효함, + 유효하지 않음?

sed - * 유효함, + 유효하지 않음?

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]**으로 확장 됩니다.-NN

나는 당신이하고 싶은 것이 다음과 같다고 생각합니다 (정확하지는 않지만 파일 이름이 어떻게 생겼는지 모르겠습니다).

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모든 이름 과 일치합니다. 파일 이름의 마지막 항목에서 모든 내용을 제거 -하고 파일 이름을 변경합니다(실제 이름 변경은 주석 처리됨).

관련 정보