
이 문제를 해결하는 데 도움이 필요합니다. 이름 목록이 포함된 파일이 있습니다.
이름.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)을 처리하므로 파일의 한 줄은 *
현재 디렉터리의 모든 파일 등으로 확장됩니다.