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?

17voto

glenn jackman Punkte 221248

Die Kombination aus Einstellung IFS und Verwendung von "$*" Sie können tun, was Sie wollen. Ich verwende eine Subshell, damit ich nicht mit dem $IFS dieser Shell interferiere

(set -- *; IFS=,; echo "$*")

Um die Ausgabe zu erfassen,

output=$(set -- *; IFS=,; echo "$*")

13voto

Ergänzend zur Antwort von majkinetor, hier der Weg zum Entfernen des nachgestellten Trennzeichens (da ich noch nicht unter seiner Antwort kommentieren kann):

ls -1 | awk 'ORS=","' | head -c -1

Entfernen Sie einfach so viele Bytes am Ende, wie Ihr Begrenzer benötigt.

Ich mag diesen Ansatz, weil ich mehrstellige Begrenzungszeichen verwenden kann und weitere Vorteile von awk :

ls -1 | awk 'ORS=", "' | head -c -2

EDIT

Wie Peter bemerkt hat, werden negative Bytezahlen in der nativen MacOS-Version von head nicht unterstützt. Dies kann jedoch leicht behoben werden.

Installieren Sie zunächst coreutils . "Die GNU Core Utilities sind die grundlegenden Datei-, Shell- und Textmanipulationsprogramme des GNU-Betriebssystems."

brew install coreutils

Befehle, die auch von MacOS bereitgestellt werden, werden mit dem Präfix "g" installiert. Zum Beispiel gls .

Sobald Sie dies getan haben, können Sie mit ghead die eine negative Byte-Anzahl hat, oder besser, machen Sie einen Alias:

alias head="ghead"

9voto

Tulains Córdova Punkte 2448

Erfinden Sie das Rad nicht neu.

ls -m

Genau das tut sie.

8voto

ghostdog74 Punkte 305138

Einfach draufhauen

mystring=$(printf "%s|" *)
echo ${mystring%|}

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

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