나는 편리하기 때문에 명령줄에서 중괄호 확장을 자주 사용합니다.
예
{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
).