sed를 사용하여 파일 이름을 바꾸는 방법은 무엇입니까?

sed를 사용하여 파일 이름을 바꾸는 방법은 무엇입니까?

이것은 기여자가 만든 sed 표현식입니다. 더 구체적으로 저자는 @craig-sanders입니다.

$FileToMove는 "2012-09-01 주택 보험 견적_zz20.pdf"로 설정됩니다.

# use sed to extract folder number from filename.
FolderNo=$(echo "$FileToMove" | sed -r -e 's/.*zz([0-9]+)\.pdf/\1/')
# On my Mac, I figured that this command needs to be FolderNo=$(echo "$FileToMove" | sed -E -e 's/.*zz([0-9]+)\.pdf/\1/')

위 명령은 파일 이름에서 "20"을 추출하는 데 사용됩니다. 이제 zz20을 null로 바꾸고 싶습니다.

항상 그렇게하려고 노력하고 있습니다. sed를 배우게 되지만 그 전에 정규식을 배워야 합니다. 또한 null로 바꾸는 것도 매우 쉽다고 확신합니다. 어떤 팁이 있나요?

답변1

파일 이름을 바꾸고 옮기고 싶으신 것 같아요.

내 사용원본 스크립트기본적으로 스크립트의 다음 부분을 변경하십시오.

if [ "$NumFolders" -eq 1 ] ; then 
  mv "$ParentFolder/$FileToMove" "$TargetFolder/" 
else

이 같은:

if [ "$NumFolders" -eq 1 ] ; then
  NewFileName=$(echo "$FileToMove" | sed -E -e 's/_zz[0-9]+\././')
  mv "$ParentFolder/$FileToMove" "$TargetFolder/$NewFileName" 
else

정규식을 장황한 영어로 번역하면 여기에서 sed 스크립트는 "입력 줄에서 '_zz 뒤에 하나 이상의 숫자 뒤에 리터럴 마침표가 오는' 첫 번째 항목"을 마침표로 바꿉니다.

즉, Ben의 답변처럼 두 개 이상의 "_zz20..." 시퀀스가 ​​포함된 파일에 대해서는 올바른 작업을 수행하지 않습니다. 이를 Birei의 정규식으로 바꾸는 것은 쉽습니다(단, \1과 \2 사이에 있는 "null"이라는 단어를 제거하면 리터럴 문자열 "null"로 대체됩니다).

NewFileName=$(echo "$FileToMove" | sed -E -e 's/^(.*)zz[0-9]+(\.pdf)$/\1\2/')

그런데 이 작업은 한 줄로 완료할 수 있고 임시 변수($NewFileName)가 필요하지 않지만 이 방식을 이해하는 것이 더 쉽습니다.

답변2

귀하의 질문을 이해한다면 아무것도 추출하고 싶지 않은 경우 .one-way를 zz20사용 하십시오.null

FolderNo=$(echo "$FileToMove" | sed -r -e 's/^(.*)zz[0-9]+(\.pdf)$/\1null\2/')

그룹 1에는 일치 전의 모든 문자를 zz20그룹 2에는 일치 후의 모든 문자를 저장합니다. 저장되지 않은 문자만 zz20손실되고 교체됩니다 null.

답변3

텍스트 "null" 대신 null 개념을 바꾸려면 다음 명령을 사용할 수 있습니다.

$ FolderNo=$(sed 's/_zz20//' <<< "2012-09-01 Home insurance quote_zz20.pdf")
$ echo $FolderNo
2012-09-01 Home insurance quote.pdf

그러면 첫 번째 항목이 _zz20아무것도 아닌 것으로 대체됩니다. 이는 sed 매개변수의 두 번째 부분이 비어 있기 때문입니다( s/search/replace/=> s/_zz20//).

내 예는 귀하가 인용한 예와 @Birei가 제안한 예만큼 주의깊지 않습니다. 파일에 "_zz20" 문자열이 여러 개 있으면 결과가 좋지 않습니다.

답변4

사용진주의rename:

rename -n 's/.*zz([0-9]+)\.pdf/$1/' ./*

출력이 만족스러우면 제거하십시오 -n(일명).dry-run

관련 정보