Bash에서 한 번에 두 개 이상의 하위 문자열을 교체하는 방법은 무엇입니까?

bash에서 에코 될 이미지 파일이 포함 된 디렉토리가 있습니다. 에코하는 동안 한 줄 명령에서 파일 이름과 확장자를 모두 바꾸고 싶습니다.

예제 파일 :

images/file_name_1.jpg images/file_name_2.jpg 

일반적으로 다음과 같이 단일 교체를 수행 할 수 있습니다.

 for i in images/*; do echo ${i/file/image}; done  

출력은 다음과 같습니다.

 images/image_name_1.jpg images/image_name_2.jpg  

어떻게 그것을 for 루프에 유지하고 “jpg”문자열을 “png”로 바꿀 수 있습니까? 이것은 단지 인스턴스 일뿐입니다. 점을 쉼표로 대체 할 수 있습니다.

이 작업을 시도 할 때 :

 for i in images/*; do echo ${{i/jpg/png}/file/image}; done  

작동하지 않습니다. 다른 해결책이나 아이디어를 찾을 수 없습니다. 가능하다면 어떻게해야합니까?

댓글

  • 나는 ' 왜 이것이 bash에서 작동하지 않았는지 ' 알 수 없지만 중첩 된 대체는 zsh에서 예상 한대로 작동합니다. 환경에 따라 더 나은 쉘;)

Answer

간단한 접근 방식은 결과를 변수에 할당 한 다음 작업하는 것입니다. 예 :

 for filename in images/* do echo "filename is now $filename" filename=${filename/jpg/png}; echo "filename is now $filename" filename=${filename/file/image}; echo "filename is now $filename" echo "final filename is ${filename}" done  

댓글

  • 이 답변은 완전하지 않습니다. 대체는 파일 이름 문자열의 모든 위치에 적용됩니다. 질문에 따라 Kubilay는 접두사와 확장자 (접미사)를 바꾸려고합니다. 수정하고 고려할 수 있습니까? : $ {var / # Pattern / Replacement} var의 접두사가 Pattern과 일치하면 Pattern을 Replace로 대체합니다. $ {var / % Pattern / Replacement} If var의 접미사가 Pattern과 일치 한 다음 대체를 Pattern으로 대체합니다.
  • @rMistero ' 답변이 수락되었다는 이유만으로 다른 답변을 게시하는 것에 대한 규칙이 없습니다. 사실, 특히 당신이 제안하는 것의 의미가 다르기 때문에 당신이해야한다고 생각합니다. 즉, 이것은 OP가 시도한 것을 수행하는 방법이므로 유효한 다른 결과가 있더라도 OP가 달성하려는 것과 일치한다고 가정하는 것이 안전하다고 생각합니다.

Answer

이전 대체를 변수에 할당하고 대신 해당 변수에 대해 대체를 실행할 수 있습니다.

 for i in images/* do j=${i/jpg/png} echo ${j/file/image} done  

댓글

  • 확실하지 않음 작동한다면. " 이미지에서 i 용 / *; do j = {i / jpg / png} echo $ {j / file / image}; done "는 " {i / jpg / png} "를 반복적으로 에코합니다.
  • 이제 예 : " for i in images / *. jpg; do j = $ {i / jpg / png}; echo $ {j / 파일 / 이미지}; 완료 ". 감사합니다!

답변

모든 문자열 변경 :

$ echo "images/file_name_1.jpg" | perl -pE "s/file/image/;s/jpg$/png/;" images/image_name_1.png 

이름 바꾸기 바로 가기 (최종 목표 일 수 있음 :

$ rename "s/file/image/;s/jpg$/png/;" "$i" 

댓글

)

  • 여전히 각 파일에 대해 Perl을 한 번 호출하는 것은 과도하다고 생각하지만 적어도 지금은이 질문에 대한 답을 제공합니다. 🙂
  • @MichaelKj ö rling 각 파일에 대해 Perl을 호출 할 필요없이 ' rename … images/*를 수행 할 수 있습니다. 하지만이를 위해서는 Debian 기반 배포판이 필요합니다 (다른 Linux 변형의 rename는 완전히 다른 명령입니다).
  • @Gilles 첫 번째 버전에 대해 더 많이 생각하고있었습니다. 특히 ' 파일 이름 변경에 대해 질문 한 내용이 없기 때문에. 이 답변의 원래 (유예 기간 편집) 버전에는 rename 명령 제안 만있었습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다