將字串附加到帶有分隔符號的變數

將字串附加到帶有分隔符號的變數

我需要幫助解決這個問題,我有一個包含名稱列表的文件:

姓名.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),因此檔案中的一行*將擴展為目前目錄中的所有檔案等。

相關內容