배쉬, ksh, zsh

배쉬, ksh, zsh

예를 {a..c}{1..3}들어 a1 a2 a3 b1 b2 b3 c1 c2 c3.

인쇄하고 싶은데 a1 b1 c1 a2 b2 c2 a3 b3 c3비슷한 방법이 있나요? 가장 쉬운 방법은 무엇입니까?

답변1

다음을 수행할 수 있습니다.

$ eval echo '{a..c}'{1..3}
a1 b1 c1 a2 b2 c2 a3 b3 c3

그런 다음 쉘에 다음을 평가하도록 지시합니다.

echo {a..c}1 {a..c}2 {a..c}3

답변2

이 특별한 경우에는 주어진 옵션이스티븐 차제라스그게 제일이야.

반면에 이 옵션은 더 복잡한 것으로 확장할 때 잘 확장되지 않습니다. 따라서 다음과 같은 방법으로 동일한 결과를 얻을 수 있습니다.

$ printf '%s\0' {a..c}{1..3} | sort -zk 1.2,1.2 | tr '\0' ' '

반품:

a1 b1 c1 a2 b2 c2 a3 b3 c3

약간 지저분해 보이지만 이제 순서를 많이 제어할 수 있으며 위 명령에서 두 문자만 변경할 수 있습니다.

$ echo {a..b}{1..2}{a..b}{1..2}

이는 다음으로 확장됩니다.

a1a1 a1a2 a1b1 a1b2 a2a1 a2a2 a2b1 a2b2 b1a1 b1a2 b1b1 b1b2 b2a1 b2a2 b2b1 b2b2

두 번째 확장의 모든 내용 을 원한다고 가정해 보겠습니다 1.2

$ printf '%s\0' {a..b}{1..2}{a..b}{1..2} | sort -zk 1.2,1.2 | tr '\0' ' '
a1a1 a1a2 a1b1 a1b2 b1a1 b1a2 b1b1 b1b2 a2a1 a2a2 a2b1 a2b2 b2a1 b2a2 b2b1 b2b2

세 번째 확장의 모든 내용 을 원한다고 가정해 보겠습니다 a.b

$ printf '%s\0' {a..b}{1..2}{a..b}{1..2} | sort -zk 1.3,1.3 | tr '\0' ' '
a1a1 a1a2 a2a1 a2a2 b1a1 b1a2 b2a1 b2a2 a1b1 a1b2 a2b1 a2b2 b1b1 b1b2 b2b1 b2b2

네 번째 확장의 모든 내용을 원한다고 가정해 1보겠습니다 2.

$ printf '%s\0' {a..b}{1..2}{a..b}{1..2} | sort -zk 1.4,1.4 | tr '\0' ' '
a1a1 a1b1 a2a1 a2b1 b1a1 b1b1 b2a1 b2b1 a1a2 a1b2 a2a2 a2b2 b1a2 b1b2 b2a2 b2b2

1a중간에 then 1b, then 2a, then 을 모두 원한다고 가정해 보겠습니다 2b.

$ printf '%s\0' {a..b}{1..2}{a..b}{1..2} | sort -zk 1.2,1.3 | tr '\0' ' '
a1a1 a1a2 b1a1 b1a2 a1b1 a1b2 b1b1 b1b2 a2a1 a2a2 b2a1 b2a2 a2b1 a2b2 b2b1 b2b2

r예를 들어 마지막 명령에 하나를 추가 하면 위 확장의 순서를 쉽게 바꿀 수도 있습니다.

$ printf '%s\0' {a..b}{1..2}{a..b}{1..2} | sort -rzk 1.2,1.3 | tr '\0' ' '
b2b2 b2b1 a2b2 a2b1 b2a2 b2a1 a2a2 a2a1 b1b2 b1b1 a1b2 a1b1 b1a2 b1a1 a1a2 a1a1

Note_1: 일반적으로 최종 확장이 인수 목록으로 사용되는 경우 후행 공백은 문제가 되지 않지만 이를 제거하려면 위의 명령에 ,를 추가할 수 있습니다.| sed 's/ $//';또는 | sed 's/ $/\n/'후행 공백을 다음으로 변경하십시오.newline

노트 2: 위의 예에서는 두 요소의 하위 집합을 사용했습니다(예:{a,b}그리고{1,2}) 개념 증명을 단순화하기 위해 유한 길이의 하위 집합을 사용할 수 있으며 해당 명령은 비교할 수 있습니다.

답변3

배쉬, ksh, zsh

(bash, ksh, zsh)에서 작동하는 한 줄짜리 코드입니다(모든 쉘이 "중괄호 확장"을 역순으로 수행할 수 있는 것은 아닙니다).

$ echo {3..1}{c..a} | rev
a1 b1 c1 a2 b2 c2 a3 b3 c3

사용된 대안은 eval다음과 같습니다(여전히 bash, ksh, zsh 및 아마도 더 신비한 작업에서 작동함).

$ eval echo '{a..c}'{1..3}
a1 b1 c1 a2 b2 c2 a3 b3 c3

무슨 일이 일어나고 있는지 보려면 다음 eval으로 바꾸십시오 echo.

$ echo echo '{a..c}'{1..3}
echo {a..c}1 {a..c}2 {a..c}3

(평가 확장 후) 실행되는 명령은 실제로 echo {a..c}1 {a..c}2 {a..c}3필요에 따라 확장될 수 있습니다.

모든 껍질

"중괄호 확장"이 없는 쉘이 여러 개 있으므로 "모든 쉘"과 함께 사용할 수 없습니다. 루프가 필요합니다(후행 공백 포함).

$ for i in 1 2 3; do for j in a b c; do printf "%s%s " "$j" "$i"; done; done; echo
a1 b1 c1 a2 b2 c2 a3 b3 c3 

뒤에 공백을 추가하면 안 되는 경우:

s=""
for i in 1 2 3; do
    for j in a b c; do
        printf "%s%s%s" "$s" "$j" "$i"
        s=" "
    done
done
echo

인쇄

a1 b1 c1 a2 b2 c2 a3 b3 c3

많은 값을 사용하여 이 작업을 수행해야 하는 경우 중괄호 확장과 같은 기능을 사용하여 숫자 목록을 생성해야 합니다 $(seq 10). 그리고 seq는 문자 목록을 생성할 수 없으므로 생성된 숫자를 ascii로 변환해야 합니다.

s=""
for i in $(seq 4); do
    for j in $(seq 5); do
        printf "%s\\$(printf %03o $((96+j)))%s" "$s" "$i"
        s=" "
    done
done
echo

인쇄:

a1 b1 c1 d1 e1 a2 b2 c2 d2 e2 a3 b3 c3 d3 e3 a4 b4 c4 d4 e4

답변4

루프를 사용하십시오.

for n in {1..3}; do printf '%s\n' {a..c}"$n"; done

이것은 첫 번째 확장을 반복한 다음 두 번째 확장을 사용하여 각 캐릭터를 확장합니다.

모든 출력을 한 줄에 표시해야 하는 경우 다음을 제거할 수 있습니다 \n.

for n in {1..3}; do printf '%s ' {a..c}"$n"; done

이렇게 하면 후행 줄 바꿈이 제공되지 않지만 이를 명령이나 변수에 전달하는 경우에는 문제가 되지 않습니다.

관련 정보