구분 기호를 사용하여 변수에 문자열 추가

구분 기호를 사용하여 변수에 문자열 추가

이 문제를 해결하는 데 도움이 필요합니다. 이름 목록이 포함된 파일이 있습니다.

이름.txt

roger
peter
henry

:모든 이름 뒤에 연결하고 싶습니다.

for i in $(cat names.txt); do
   $i+=$i":"
done 

내가 원하는 출력은 이것이다roger:peter:henry

하지만 나는이 결과를 얻고 있습니다roger:peter:henry:

답변1

이를 수행할 수 있는 도구가 있습니다.paste

$ paste -sd: names.txt
roger:peter:henry

답변2

sed및 다음을 사용한 대체 솔루션 tr:

sed '$!s/$/:/' names.txt | tr -d '\n'

출력:

roger:peter:henry

답변3

paste작업에 적합한 도구입니다. 하지만 완전성을 기하기 위해 시도한 작업을 수행하는 방법은 다음과 같습니다.

k="$(head -n1 names.txt)";
for i in $(tail -n+2 names.txt); do 
    k="$k:$i"; 
done

이는 다음을 생성합니다.

$ echo "$k"
roger:peter:henry

답변4

$i+=$i":"

이것은 당신이 원하는 것을 하지 않습니다. 대신 표시된 위치에서 확장하고 $i결과를 명령으로 실행하려고 시도합니다. 쉘 할당은 왼쪽에 있는 달러 기호를 사용하지 않습니다(변수 값을 사용하는 것으로 생각하십시오. 여기서는 원하지 않지만 저장할 위치를 사용합니다). 대신 그래야합니다 i+=$i":". 아니면 i+="$i:"쉘 변수 확장을 인용하는 습관을 들이는 것이 바람직합니다.

또한 루프 변수로 사용되는 변수에 추가하려고 합니다. 루프의 다음 라운드에서 덮어쓰이기 때문에 별로 유용하지 않습니다. 또한 마지막 항목을 포함하여 각 항목 뒤에 콜론을 추가하므로 끝에 하나가 있게 됩니다. 하지만 나중에 확장을 통해 제거할 수 있습니다 ${var%suffix}.

그래서:

s=
for i in $(cat names.txt); do
   s+="$i:"
done 
s=${s%:}

따옴표가 없는 확장은 $(cat)모든 파일 이름 와일드카드 패턴(globs)을 처리하므로 파일의 한 줄은 *현재 디렉터리의 모든 파일 등으로 확장됩니다.

관련 정보