배쉬-연속 문자열 조작


11
#!/bin/bash

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

어쨌든이 두 줄을 하나의 라이너에 붙이는 것이 있습니까?

답변:


12

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그렇습니다.
gsklee

11

bash (ksh, ash 및 zsh 이외의 다른 쉘)에는 확장을 중첩 할 수 없습니다. 설명 할 때 임시 표현식에 중간 표현식을 지정할 수 있으므로 이는 외관상의 한계입니다. 한 줄짜리 사람에게는 약간 성가 시지만 스크립트에서는 가독성이 더 좋습니다.

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

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

여기서 대체 스크립트를 외부에 배치 하기 위해 스크립트를 다시 작성할 수 있습니다 . 그것은 일반적인 현상이 아니며 특정 단일 라이너 느낌 이외의 것을 얻지 못합니다.

Zsh는 더 나은지 나쁜지에 따라 확장을 중첩시킬 수 있습니다.

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

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

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

4

나는 갈 것이다 :

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

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


3

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

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

2

통합 sed하면 트릭을 수행해야합니다.

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

(이것은 할 수 없기 때문에 귀하의 질문에 정확하게 답변하지는 않습니다. 가능한지 확실하지 않습니다.)


1

Bash ${}구문은 변수 이름으로 작동 하므로 명령을 직접 포함시킬 수 없습니다. 여분의 포크를 신경 쓰지 않으면 @ sr_의 접근법이 대안입니다.


1

라인

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

단축 및 휴대 성이 향상

FILE=$(basename "${1%.jpeg}.jpg")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.