
我需要幫助解決這個問題,我有一個包含名稱列表的文件:
姓名.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
在標記的位置展開,並嘗試將結果作為命令運行。 shell 賦值不會採用左側的美元符號(將其視為採用變數的值,這裡我們不需要它,而是要儲存的位置)。應該是i+=$i":"
相反。或者最好i+="$i:"
只是養成引用 shell 變數擴展的習慣。
此外,您嘗試附加到用作循環變數的變數。這不是很有用,因為它會在下一輪循環中被覆蓋。另外,您要在每一項(包括最後一項)後面加上一個冒號,這樣您就會在末尾看到一個冒號。但我們可以在${var%suffix}
擴充後將其刪除。
所以:
s=
for i in $(cat names.txt); do
s+="$i:"
done
s=${s%:}
但請注意,不含引號的擴充$(cat)
將處理任何檔案名稱通配符模式(glob),因此檔案中的一行*
將擴展為目前目錄中的所有檔案等。