580 Stimmen

Wie lassen sich mehrere Zeilen mit Dateinamen zu einer Zeile mit benutzerdefiniertem Trennzeichen zusammenfügen?

Ich möchte mich dem Ergebnis von ls -1 in eine Zeile einfügen und sie mit einem beliebigen Zeichen abgrenzen.

Gibt es irgendwelche Standard-Linux-Befehle, mit denen ich dies erreichen kann?

7voto

zhazha Punkte 2504

Der Sed-Weg,

sed -e ':a; N; $!ba; s/\n/,/g'
  # :a         # label called 'a'
  # N          # append next line into Pattern Space (see info sed)
  # $!ba       # if it's the last line ($) do not (!) jump to (b) label :a (a) - break loop
  # s/\n/,/g   # any substitution you want

Hinweis :

Dies ist linear in der Komplexität, da nur einmal substituiert wird, nachdem alle Zeilen in den Pattern Space von sed eingefügt wurden.

@AnandRajaseka's Antwort und einige andere ähnliche Antworten, wie zum Beispiel hier sind O(n²), da sed jedes Mal, wenn eine neue Zeile an den Pattern Space angehängt wird, eine Ersetzung vornehmen muss.

Zum Vergleich,

seq 1 100000 | sed ':a; N; $!ba; s/\n/,/g' | head -c 80
  # linear, in less than 0.1s
seq 1 100000 | sed ':a; /$/N; s/\n/,/; ta' | head -c 80
  # quadratic, hung

6voto

Anand Rajasekar Punkte 827
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]

Erläuterung:

-e - bezeichnet einen auszuführenden Befehl
:a - ist ein Etikett
/$/N - definiert den Umfang der Übereinstimmung für die aktuelle und die (N)ext-Linie
s/\n/\\n/; - Ersetzt alle EOL durch \n
ta; - bei erfolgreicher Übereinstimmung zu Etikett a gehen

Entnommen aus mein Blog .

6voto

yabt Punkte 61

Um eine mögliche Verwechslung der Zeilenumbrüche für tr zu vermeiden, könnten wir ls mit dem Flag -b versehen:

ls -1b | tr '\n' ';'

6voto

plhn Punkte 4557

Es sieht so aus, als gäbe es die Antworten bereits.

Wenn Sie wollen a, b, c Format, verwenden Sie ls -m ( Tulains Córdovas Antwort )

Oder wenn Sie wollen a b c Format, verwenden Sie ls | xargs (vereinfachte Version von Antwort von Chris J. )

Oder wenn Sie ein anderes Begrenzungszeichen wie | verwenden ls | paste -sd'|' (Anwendung von Artem's Antwort )

3voto

Chris J Punkte 9032

Wenn Ihre Version von xargs das Flag -d unterstützt, sollte dies funktionieren

ls  | xargs -d, -L 1 echo

-d ist das Trennzeichen-Flag

Wenn Sie nicht über -d verfügen, können Sie Folgendes versuchen

ls | xargs -I {} echo {}, | xargs echo

Mit dem ersten xargs können Sie Ihr Trennzeichen angeben, das in diesem Beispiel ein Komma ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X