Anhängen einer Zeichenfolge an eine Variable mit Trennzeichen

Anhängen einer Zeichenfolge an eine Variable mit Trennzeichen

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 sedund tr:

sed '$!s/$/:/' names.txt | tr -d '\n'

Ausgänge:

roger:peter:henry

Antwort3

pasteist 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 $ian 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.

verwandte Informationen