OS X에서 Bash 4.3 서브 스트링 음수 길이


12

Bash 4.2는 음의 부분 문자열 길이에 대한 지원을 추가했습니다.

http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01

예 37-12. 문자열 추출 구문의 음수 매개 변수

"길이"매개 변수가 음수이면 끝에서 오프셋 매개 변수로 사용됩니다.

예를 들어 다음은 Ubuntu에서 테스트 할 때 "World"출력입니다.

STR="Hello World!"
echo ${STR:6:-1}

그러나 OS X (GNU bash, 버전 4.3.42 (1)-릴리스 (x86_64-apple-darwin14.5.0))에서 해당 사용법으로 인해 다음 오류가 발생합니다.

-1: substring expression < 0

이 OS X에만 해당됩니까, 아니면 나중에 bash 업데이트에서 다시 비활성화 되었습니까? OS X에서이 기능을 활성화하는 방법이 있습니까?


1
tldp.org/LDP/abs/html/abs-guide.html#BASH2-v2 , v3 및 v4로 시작할 때 추가 된 사항은 다음과 같습니다.
Hannu

@Hannu 네, 그 문서는 음의 길이 의미가 버전 4.2에 추가되었다고 말합니다
Brent Faust

나는 같은 문제가 있습니다 : 당신은 그것을 처리하는 방법을 찾았습니까?
Romain Jouin

@romainjouin 그냥 알고리즘을 변경하여. 이 구문은 Bash 버전 4.3.46부터 OX X에서만 작동하지 않습니다! 더 많은 관심을 끌기 위해 질문에 투표하십시오. 누군가 대답을 알고 ...
브렌트 파우스트

1
@Rubistro 그냥 이것을 누르십시오 : | 한 가지 방법은 (예시)echo "Hello World" | rev | cut -c -5 | rev
donovanmuller

답변:


7

flabdablet의 솔루션은 고정 길이 문자열에서만 작동하지만 동적 크기 문자열의 드롭 인 대체로 사용할 수 있습니다.

echo ${STR:6:$((${#STR} - 6 - 1))}

상세히:

  • ${#STR} 문자열의 길이를 반환합니다.
  • $((a - b - c)) 수학 빼기
  • ${STR:start:len} 부분 문자열을 반환합니다.

따라서 하위 문자열 표현식에 대한 두 번째 인수는 문자열의 길이에서 시작 오프셋에서 새로운 bash 구문에서 음수 값으로 지정할 값을 뺀 값입니다.


2

STR에 7 자 이상이 포함되어 있으면 $ {STR : 6 : $ {# STR} -7}이 (가) $ {STR : 6 : -1} 대신 작동하는 드롭 인 대체품이어야합니다. 더 짧을 수 있으면 OS X bash가 음수 길이에 대해 불평하거나 음수 길이를 오른쪽에서 오프셋으로 가져 오는 bash 버전에서 끔찍하게 잘못됩니다.


Thx, 나를 위해 속임수
장-베르나르 Jansen

0

여기 에서 Googled :

그들은 ${STR:6:$#-1}잘 작동 한다고 말합니다

필자의 경우 비슷한 오류가 발생 ${VERSION::-2}하여 다음과 같이 0을 추가 한 후 작동하기 시작했습니다 ${VERSION:0:-2}.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.