我需要帮助解决这个问题,我有一个包含名称列表的文件:
姓名.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),因此文件中的一行*
将扩展为当前目录中的所有文件等。