bash for 루프에서 생성된 문자열에서 마지막 쉼표를 제거합니다.

bash for 루프에서 생성된 문자열에서 마지막 쉼표를 제거합니다.

배열에서 구분 기호로 쉼표로 구분된 목록을 만들고 마지막 쉼표를 제거해야 하는 상황에서 작업 중입니다. 나는 bash for파이핑을 사용하여 sed모든 쉼표를 제거하지만 마지막 쉼표는 제거하지 않습니다. 단순화된 예는 다음과 같습니다.

x=$(for i in a b c; do echo "${i}",; done| sed 's/,$//')
echo $x
a b c

원하는 출력:

a, b, c

어떤 제안이라도 감사하겠습니다.

답변1

한 가지 옵션은 지속하는 것입니다bash

arr=(a b c)
x=$(IFS=,;printf  "%s" "${arr[*]}")
echo "$x"
a,b,c

번갈아

arr=(a b c)
printf -v x "%s," "${arr[@]}"
x=${x%,}
echo "$x"
a,b,c

두 번째 옵션을 사용하면 구분 기호를 개별적으로 설정하는 ,대신 (쉼표 다음에 공백이 따라옴) 로 설정할 수 있습니다.,

printf -v x "%s, " "${arr[@]}"
x=${x%, }
echo "$x"
a, b, c

답변2

또 다른 유용한 기술은 다음과 같습니다 paste -s.

$ arr=(a b c)
$ printf "%s\n" "${arr[@]}" | paste -sd,
a,b,c

( paste -sd,이것은 매우 일반적인 "개행으로 구분된 항목 집합을 쉼표로 구분된 목록으로 변환" 작업입니다.)

답변3

문제는 기본적으로 echo호출될 때마다 새 행을 추가하고 sed해당 새 행에서 작동한다는 것입니다. $(...)Bash가 새 줄을 처리할 때 이러한 새 줄이 공백으로 변환되기 때문에 이 내용이 표시되지 않습니다 . 따라서 접근 방식을 최소한으로 변경하면서 문제를 해결하려면 다음을 수행하십시오.

$ x=$(for i in a b c; do echo -n "${i}",; done| sed 's/,$//') ; echo $x
a,b,c

이 옵션은 새 줄을 추가하지 않도록 -n지시합니다 .echo

항목 사이에 공백이 필요한 경우 쉽게 추가할 수 있습니다.

$ x=$(for i in a b c; do echo -n "${i}, " ; done| sed 's/, $//') ;echo $x
a, b, c

답변4

$ w=(a b c)

$ IFS=, eval 'echo "${w[*]}"'
a,b,c

참고로, 그렇지 않나요? 바퀴를 재발명하다 여기?

관련 정보