Bash-연속 문자열 조작

#!/bin/bash FILE="$(basename "$1")" FILE="${FILE/%.jpeg/.jpg}" 

어쨌든이 두 줄을 한 줄로 붙일 수 있습니까?

답변

FILE=$(basename "${1/%.jpeg/.jpg}")가 저에게 효과적이었습니다.

테스트 :

bash-$ ./test.sh /tmp/foo.jpeg foo.jpg 

스크립트 내용 :

bash-$ cat test.sh #!/usr/bin/bash FILE=$(basename "${1/%.jpeg/.jpg}") echo "$FILE" 

댓글

  • 두 줄은 서로 바꿔서 사용할 수 있으므로 지금까지이 솔루션이 가장 간단합니다. 줄이 서로 바뀌지 않는 경우 ' sed는 확실히 필요합니다.

답변

당신은 중첩 할 수 없습니다. bash의 확장 (zsh를 제외한 ksh, ash 및 기타 셸에서도 마찬가지 임). 이것은 단지 외관상의 제한 일뿐입니다. 설명하는 것처럼 임시 변수에 중간 표현식을 할당 할 수 있기 때문입니다. 스크립트에서는 가독성면에서 틀림없이 더 좋습니다.

피할 수 있습니다. 외부 유틸리티 basename를 부르고 대신 문자열 조작 구문을 사용합니다.

FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}" 

여기에서 다음과 같이 할 수 있습니다. 스크립트를 다시 작성하여 명령 대체를 외부에 배치 합니다. 이것은 일반적인 현상이 아니며 특정 한 줄짜리 느낌 외에는 아무것도 얻지 못합니다.

Zsh는 좋든 나쁘 든 확장을 중첩 할 수 있습니다.

FILE=${$(basename $1)/%.jpeg/.jpg} # using basename FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting 

또는 basename 대신 zsh “의 내장 구문을 사용할 수 있습니다.

FILE=${${1:t}/%.jpeg/.jpg} 

답변

내가 갈 것 :

FILE=$(basename $1 .jpeg).jpg 

basename의 두 번째 매개 변수는 파일 이름에서 제거 할 접미사입니다 (man basename 참조)

Answer

다음과 같이 단일 sed 명령을 사용할 수 있습니다.

FILE=$(sed "s/.*\///;s/\.jpeg$/.jpg/" <<<"$1") 

답변

sed를 통합하면 다음과 같은 방법을 사용할 수 있습니다.

FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)" 

(“할 수 없기 때문에 귀하의 질문에 정확히 대답하지 못합니다. 가능한지 확실하지 않습니다.)

답변

Bash 구문은 변수 이름 과 함께 작동하므로 명령을 직접 삽입 할 수있는 방법이 없습니다. @sr_ “의 접근 방식은 여분의 포크가 마음에 들지 않는다면 대안입니다.

답변

FILE=$(basename "${1/%.jpeg/.jpg}") 

FILE=$(basename "${1%.jpeg}.jpg") 

를 사용하여 길이를 줄이고 휴대 성을 높일 수 있습니다.

답글 남기기

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