
Ich brauche Hilfe bei der Lösung dieses Problems. Ich habe eine Datei, die eine Liste mit Namen enthält:
Namen.txt
roger
peter
henry
Ich möchte :
nach jedem Namen verketten
for i in $(cat names.txt); do
$i+=$i":"
done
Die Ausgabe, die ich will, ist dieseroger:peter:henry
aber ich bekomme diese Ausgaberoger:peter:henry:
Antwort1
Es gibt ein Tool, das dies für Sie erledigen kann:paste
$ paste -sd: names.txt
roger:peter:henry
Antwort2
Eine alternative Lösung mit sed
und tr
:
sed '$!s/$/:/' names.txt | tr -d '\n'
Ausgänge:
roger:peter:henry
Antwort3
paste
ist das richtige Werkzeug für diese Aufgabe. Aber nur der Vollständigkeit halber hier eine Anleitung, wie Sie das tun, was Sie versucht haben:
k="$(head -n1 names.txt)";
for i in $(tail -n+2 names.txt); do
k="$k:$i";
done
Das Ergebnis:
$ echo "$k"
roger:peter:henry
Antwort4
$i+=$i":"
Dies führt nicht das aus, was Sie möchten. Stattdessen wird es $i
an den markierten Stellen erweitert und versucht, das Ergebnis als Befehl auszuführen. Eine Shell-Zuweisung übernimmt nicht das Dollarzeichen auf der linken Seite (stellen Sie sich vor, es übernimmt den Wert der Variablen, hier wollen wir das nicht, sondern den Speicherort). i+=$i":"
Stattdessen sollte es so sein. Oder besser, i+="$i:"
um sich einfach anzugewöhnen, Shell-Variablenerweiterungen in Anführungszeichen zu setzen.
Außerdem versuchst du, etwas an die Variable anzuhängen, die als Schleifenvariable verwendet wird. Das ist nicht sehr nützlich, da es in der nächsten Schleifenrunde überschrieben wird. Außerdem fügst du nach jedem Element einen Doppelpunkt hinzu, auch nach dem letzten, sodass du am Ende einen hast. Aber wir können ihn später mit der ${var%suffix}
Erweiterung entfernen.
Also:
s=
for i in $(cat names.txt); do
s+="$i:"
done
s=${s%:}
Beachten Sie jedoch, dass die nicht in Anführungszeichen gesetzte Erweiterung $(cat)
alle Platzhaltermuster (Globs) in Dateinamen verarbeitet, sodass eine Zeile *
in der Datei auf alle Dateien im aktuellen Verzeichnis usw. erweitert wird.