중괄호 확장을 사용하여 선행 0으로 시퀀스를 만드는 방법


45

다음을 사용하면 예상대로 결과가 나타납니다.

$ echo {8..10}
8 9 10

다음 중괄호 확장을 쉽게 사용하여 다음과 같은 결과를 얻으려면 어떻게해야합니까?

$ echo {8..10}
08 09 10

나는 이것이 seq(시도하지 않은)을 사용하여 얻을 수 있지만, 내가 찾고있는 것이 아닙니다.

유용한 정보는 내가이 bash 버전으로 제한되어 있다는 것입니다. ( zsh솔루션이 있지만 bash솔루션이 없는 경우 공유하십시오)

$ bash -version
GNU bash, version 3.2.51(1)-release (x86_64-suse-linux-gnu)

bash 3 에서이 작업을 수행하는 데 도움이되는 힌트 : here : mywiki.wooledge.org/BashFAQ/018 그러나 접근 방식은 편리하지 않습니다.
Bernhard

답변:


70

첫 번째 숫자 앞에 a 0를 붙여 각 항의 너비가 동일하게하십시오.

$ echo {08..10}
08 09 10

Brace Expansion의 bash 매뉴얼 페이지 섹션에서 :

제공된 정수는 각 접두어가 동일한 너비를 갖도록 0으로 시작될 수 있습니다. x 또는 y가 0으로 시작하면 셸은 생성 된 모든 항에 필요한 경우 제로 패딩이없는 동일한 자릿수를 포함하도록합니다.

또한 선행 0으로 채워서 너비를 동일하게 seq하는 -w옵션 과 함께 사용할 수 있습니다 .

$ seq -w 8 10
08
09
10

$ seq -s " " -w 8 10
08 09 10

더 많은 제어를 원한다면 printf 스타일 형식을 지정할 수도 있습니다.

$ seq -s " " -f %02g 8 10
08 09 10

8
echo {08..10}그러나 솔루션 에 대해 방금 알게 된 후에 는 bash 버전 4 이상에서만 소개되었습니다.
Bernhard

bash가 그렇게하는 것이 조금 불편합니다. 여러 유틸리티 (예 perl:)에서 선행 0은 8 진수를 나타냅니다. 나는 당신이 8 진수의 시퀀스를 원치 않는 경우가 종종 있다고 생각합니다 ...
kurtm

5
당신은 또한에 다음주는 숫자 앞에 수 있음에 유의해야한다 seq-w너무 같은 스위치 : seq -w 003번호 001, 002, 및 003 생산
SLM

@kurtm은 선행 제로에 대해 걱정하지 않습니다. 무언가를 파싱하려고 할 때 아플 수 있습니다. 이것이 실제로 유용한 것은 foo_00001.someextension거의 모든 정렬 컨텍스트가 정상적인 순서를 제공하는 파일 이름 시퀀스를 생성하는 것 입니다.
Stéphane Gourichon

9

printf를 사용한다면

printf "%.2d " {8..10} 

이 문자는 강제로 2 자이며 앞에 0을 추가합니다. 3 자리 숫자가 필요한 경우 "% .3d"로 변경할 수 있습니다.


답변 주셔서 감사합니다. 나는 printf해결책을 알고 있지만 실제로 이것을 더 쉽게하지는 않습니다. 나는 일을하는 숨겨진 트릭이 있기를 바라고 있습니다 :)
Bernhard

이것은 숫자의 기원에 대한 모든 상황을 처리하기에 충분히 다재다능한 것처럼 보이는 유일한 대답입니다. 파일을 반복하면서 카운터를 사용하고 있습니다. 이 printf 솔루션은 완벽하게 제로 패드를 만드는 반면 다른 모든 것은 제로 패딩 기존 숫자 대신 제로 패딩 숫자를 생성하는 데 집중하는 것 같습니다.
mightypile

7

일정한 숫자로 시작하는 범위를 사용하고 해당 숫자를 제거하십시오.

echo \ {108..110} | sed 's/ 1//g'

또는 외부 명령을 사용하지 않고 :

a=({108..110}); echo "${a[@]#1}"

for 루프에서 사용하기 위해 :

for x in {108..110}; do
  x=${x#1}
  
done

그러나이 경우 while 루프가 더 명확하고 모든 POSIX 셸에서 작동합니다.

x=8
while [ $x -le 10 ]; do
  n=$((100+x)); n=${n#1}
  
  x=$((x+1))
done

Bash 3.x에 대한 요청을 충족시키기 때문에 다른 답변보다이 답변을 수락했습니다. 특히 for어쨌든 루프가 필요했습니다 .
Bernhard

6

원본 포스터 ( GNU bash, version 3.2.51(1)-release)와 동일한 bash 버전이 있으며 {08..12}작동하지 않지만 다음은 작동합니다.

for i in 0{8..9} {10..12}; do echo $i; done
08
09
10
11
12

좀 더 지루하지만 OP 버전의 bash (및 이후 버전에서는 작동한다고 가정)에서 작동합니다.


나는이 해결책에 대해 생각하지 않았다. (내 경우에는 실제로 0001 1000을 원하지만 당신의 원칙은 물론 작동한다.)
Bernhard

1

참고로, 자동 고정 너비는 최신 버전의 bash에서만 발생한다고 생각합니다.

$ bash -version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

$ echo test{00..05}
test0 test1 test2 test3 test4 test5

-3
for i in $(seq -s " " -f %0${zeros}g $ini $fin); do ....;done

0, ini 및 지느러미는 vars이므로 쉽게 사용할 수 있습니다.

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