중괄호 확장을 사용하여 선행 0으로 시퀀스를 만드는 방법 결과를 얻으려면 어떻게해야합니까?

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

$ 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)



답변

첫 번째 숫자 앞에 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


답변

printf를 사용한다면

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

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


답변

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

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


답변

원본 포스터 ( 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 (및 이후 버전에서는 작동한다고 가정)에서 작동합니다.


답변

참고로, 자동 고정 너비는 최신 버전의 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


답변

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

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


답변