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