bash 괄호 확장을 사용하여 쉼표로 구분 된 문자열을 출력하는 방법


17

내가 좋아하는 것

$ echo a{b,c,d}

쉼표로 구분 된 목록을 출력합니다.

ab,ac,ad

일반적인 출력 대신

ab ac ad

명령 줄에서 가장 쉬운 방법은 무엇입니까?

답변:


9

요소에 공백이 없다고 가정하면 공백을 쉼표로 변환 할 수 있습니다.

echo a{b,c,d} | tr ' ' ,

어떤 생산 :

ab,ac,ad

문자와 함께 범위를 사용할 수도 있습니다.

echo a{b..d} | tr ' ' ,

더 넓은 범위를 원할 때 특히 유용합니다.


13

bash는 $ IFS를 사용하여 생성 된 단어에 참여하지 않는 것 같습니다. 또 다른 기술은 생성 된 단어를 배열에 저장 한 다음 $ IFS를 사용하는 것입니다 .

서브 쉘을 사용하여이 쉘의 IFS를 변경하지 않습니다.

( words=( a{b,c,d} ); IFS=,; echo "${words[*]}" )
( set -- a{b,c,d}; IFS=,; echo "$*" )

쉼표로 구분 된 문자열을 stdout으로 내 보냅니다. 캡처하려면 다음을 수행하십시오.

joined=$( set -- a{b,c,d}; IFS=,; echo "$*" )

생성 된 단어를 전혀 결합 하지 않습니다 . 그것은 요점입니다. 그것은 단어를 분리하기 위해 확장됩니다.
Stéphane Chazelas

5

나는 이것을 달성 할 수있는 많은 방법이 있다고 확신합니다. 한 가지 방법이 있습니다.

echo a{b,c,d} | sed 's/ /,/g'

2

표시 한대로 요소를 확장 한 다음 반복하여 첫 번째 반복을 제외한 모든 요소에 쉼표를 추가하십시오.

for i in a{b,c,d}; do
  u="${u:+$u, }$i"
done
echo "$u"

결과:

ab, ac, ad

bash 매개 변수 대체를 참조하십시오 .


1

bash 전용 솔루션은 다음과 같습니다.

(IN=$(echo a{b,c,d}); echo ${IN// /,})
# ab,ac,ad

세미콜론 앞 부분 ab ac ad은 변수에 할당 되고 IN두 번째 부분은 검색 및 바꾸기를 사용하여 모든 공백을 쉼표로 변경합니다. 이것은 //첫 번째뿐만 아니라 모든 일치를 의미합니다.

네임 스페이스를 오염시키지 않으려면 서브 쉘 (괄호 괄호)에서 모두 수행하십시오.


1

많은 상황에서 후행 쉼표가 그러한 목록에서 허용된다는 점은 주목할 가치가 있습니다. 경우 후행 쉼표 허용, 대체를 처리 할 수있는 가장 쉬운 방법입니다 printf:

some-command "$(printf %s, a{b,c,d} )"

(어디 some-command쉼표에서 실행 목록을 분리하고, 콤마 신경 쓰지 않는 명령입니다.)

실제로 쉼표가 없어도 사용할 수 있습니다 printf. 당신은 당신이 기대하는 인수의 수를 지정해야하므로 매우 긴 목록을 위해 더 어색합니다.

some-command "$(printf %s,%s,%s a{b,c,d} )"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.