조합 폭발 없이 여러 지원 확장을 수행하는 방법은 무엇입니까?

조합 폭발 없이 여러 지원 확장을 수행하는 방법은 무엇입니까?

나는 편리하기 때문에 명령줄에서 중괄호 확장을 자주 사용합니다.

{foo,bar}

확장:

foo bar

다중 버팀대 확장도 확장됩니다. 예를 들면 다음과 같습니다.

{foo,bar}Q{foo,bar}

다음으로 확장 예정:

fooQfoo fooQbar barQfoo barQbar

이는 중괄호 확장이 순차적으로 사용되는 경우 예상되는 동작입니다.

내 질문

이제 중괄호 확장(또는 기타 짧은 명령줄 트릭)의 출력을 다음과 같이 만들고 싶습니다.

fooQfoo barQbar

참고: 저는bash 3.2

답변1

나는 slm에 동의합니다. 중괄호 확장을 통해서만 이 작업을 수행할 수 있는 방법을 본 적이 없습니다.

그러나 질문의 ​​예를 사용하면 원하는 출력을 얻는 가장 쉬운 방법은 중괄호 확장 및 추가 후처리보다는 루프를 사용하는 것이라고 생각합니다.

$ echo $(for X in foo bar;do echo ${X}Q${X};done)
fooQfoo barQbar

답변2

중괄호만 사용하여 이 작업을 수행하는 방법을 모르겠습니다. 나 역시 이를 달성할 수 있는 방법을 찾지 못했기 때문에 나보다 똑똑한 사람이 방법을 찾지 않는 이상 불가능하다고 말하고 싶다.

대안으로

견본

$ tree
.
|-- dir1
|   |-- file1
|   `-- file2
`-- dir2
    |-- file1
    `-- file2

$ seq 2 | xargs -i{} echo dir{}/file{}
dir1/file1
dir2/file2

이는 다음과 같은 명령에 포함될 수 있습니다.

$ echo $(seq 2 | xargs -i{} echo dir{}/file{})
dir1/file1 dir2/file2

아니면 이거:

$ ls $(seq 2 | xargs -i{} echo dir{}/file{})
dir1/file1  dir2/file2

아니면 이거:

$ ls -l $(seq 2 | xargs -i{} echo dir{}/file{})
-rw-rw-r-- 1 saml saml 0 Sep  2 03:18 dir1/file1
-rw-rw-r-- 1 saml saml 0 Sep  2 03:31 dir2/file2

왜 중괄호가 효과를 발휘하지 못하는 걸까요?

원래 예를 보면 다음과 같습니다.

{foo,bar}Q{foo,bar}

다음과 같이 확장됩니다.

fooQfoo fooQbar barQfoo barQbar

이 메커니즘을 확장한 메커니즘을데카르트 곱.

예를 들어:

$ echo {A,B}{X,Y,Z}
AX AY AZ BX BY BZ

아니면 이거:

$ echo {M,N}-{A,B}{X,Y,Z}
M-AX M-AY M-AZ M-BX M-BY M-BZ N-AX N-AY N-AZ N-BX N-BY N-BZ

다음과 같은 결과를 초래하는 데카르트 곱을 생성하는 것은 불가능합니다.

fooQfoo barQbar

유일한 옵션은 다음과 같은 트릭을 사용하는 것입니다.

$ echo dir{1,2}/file{2,1}
dir1/file2 dir1/file1 dir2/file2 dir2/file1

그런 다음 Bash 배열에 넣으십시오.

$ a=(dir{1,2}/file{2,1})
$ echo ${a[@]:1:2}
dir1/file1 dir2/file2

또 다른 옵션은 위에서 설명한 것과 같은 "다른 방법"입니다( 사용 xargs).

인용하다

관련 정보