오른쪽에서 왼쪽으로 쉘 괄호 확장


9

zsh (및 다른 쉘)에서 (예를 들어)와 같은 인수를 포함하면 :

{a,b,c}{d,e,f}

괄호 확장은 다음과 같이 바뀝니다.

ad ae af bd be bf cd ce cf

내 목적을 위해 인수 순서가 중요하며 왼쪽에서 오른쪽 대신 오른쪽에서 왼쪽으로 확장하려면 괄호가 필요합니다. 즉, 확장을 원합니다.

ad bd cd ae be ce af bf cf

여러 괄호 세트가 확장되는 순서를 제어하는 ​​방법이 있습니까? 나는 이러한 주장뿐만 아니라 어떤 상황에서도 효과가있는 것을 찾고 있습니다.


루프 또는 정렬 된 출력과 관련된보다 복잡한 솔루션에 관심이 없다고 가정합니다.
terdon

@terdon 내가 생각하는 다른 방법이 없다면; 나는 중괄호 확장의 평가 순서를 변경하는 약간의 트릭이 있기를 바랐지만 아마도 그렇지 않습니다. 이러한 주장은 단지 예일 뿐이므로 효과 {a,b,c}{d,e,f}가있는 것은 그다지 도움이되지 않습니다
Michael Mrozek

그래, 나도 짐작 했어 정렬 순서에 따라 답변을 피하기 위해 명확하게하고 싶을 수도 있습니다.
terdon

답변:


8

매개 변수 확장을 가새 확장과 결합 할 수 있습니다.

% foo=(d e f)
$ echo {a,b,c}${^foo}
ad bd cd ae be ce af bf cf

foo개별적 으로 정의하지 않으려는 경우 (가능한 것처럼) 다음을 사용할 수 있습니다.

$ echo {a,b,c}${^:-d e f}
ad bd cd ae be ce af bf cf

당신이있는 경우 rcexpandparam옵션 세트를, 당신은 필요하지 않습니다 ^이 동작을 가능하게하는 하나의 예에서.

(참고 : 테스트하는 동안 shwordsplit옵션도 설정했습니다. 설정하지 않은 경우 예를 들어보십시오 echo {a,b,c}${^=:-d e f}. 이야기의 도덕 : 거의 모든 것이 가능 zsh하지만 올바른 사용법을 사용해야합니다 옵션과 구문의 조합)


1
print -- {a,b,c}${^=:-d e f}의 기본 시간 split+glob이 해제되어 있으므로 기본 예를 사용해야합니다 zsh.
cuonglm

4

다음 과 같이 지정된 수의 열 인수를 zsh사용할 수 있습니다 .-C print

print $(print -C3 {a,b,c}{d,e,f})

...를 얻기 위해 ...

ad bd cd ae be ce af bf cf

... $IFS분할 없이 :

print -C3 {a,b,c}{d,e,f}

...인쇄물...

ad bd cd
ae be ce
af bf cf

...하지만 당신은 그렇게 전에 아래로 그것을 할 수 있습니다 ...

print -aC3 {a,b,c}{d,e,f}

ad ae af
bd be bf
cd ce cf

...또는...

print $(print -aC2 {foo,bar}{bad,baz})

foobad foobaz barbad barbaz

그것은 MIchael이 피하려고하는 것과 동일한 출력을 생성합니다. 그는 1.1 2.1 3.1을 원하고 1.1 1.2 1.3 (명확한 경우)을 제공합니다.
terdon

@ terdon-좋은 지적.
mikeserv

마이클이 특정 페어링 순서를 따랐다는 것을 (명백하게 언급하지는 않았지만) 추측하고 있습니다. 요소를 알파벳순으로 정렬 할 수있는 경우에만 접근 방식이 작동합니다. foobad foobaz barbad barbaz{foo, bar} {bad, baz}`에서 오는 것은 어떻습니까?
terdon

@ terdon-글쎄, 그 다음에 그가 그렇게하면 왜 그렇게 말하지 않습니까? 어쨌든 수학을 수행하면 열을 어떤 방식 으로든 페어링 할 수 있습니다.
mikeserv

1
@ terdon-당신은 중재자가 당신이 의미하지 않는 것을 말하는 습관을 만드는 것처럼 보입니다.
mikeserv

2

두 번째 세트의 각 요소 끝에 숫자를 넣은 다음 마지막 문자를 기준으로 정렬 할 수 있습니다.

echo -e "\n"{a,b,c}{d1,e2,f3} | sort -k 1.3 | cut -c 1-2 | tr '\n' ' '

문자가 아닌 필드를 자르려면 구분 기호 (공백) 뒤에 숫자를 추가하는 것이 더 좋습니다.

echo -e "\n"{a,b,c}{"d 1","e 2","f 3"} | sort -k 2n | cut -f 1 -d ' ' -s | tr '\n' ' '

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