![배쉬, ksh, zsh](https://linux55.com/image/155793/%EB%B0%B0%EC%89%AC%2C%20ksh%2C%20zsh.png)
예를 {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
이렇게 하면 후행 줄 바꿈이 제공되지 않지만 이를 명령이나 변수에 전달하는 경우에는 문제가 되지 않습니다.