Ich möchte das Ergebnis von ls -1
in einer Zeile zusammenfassen und es mit dem abgrenzen, was ich will.
Gibt es Standard-Linux-Befehle, mit denen ich dies erreichen kann?
Ähnlich wie bei der allerersten Option, lässt jedoch das nachfolgende Trennzeichen weg
ls -1 | paste -sd "," -
ls -1 | paste -s -d ":" -
Nicht sicher, ob das bei allen Versionen von Paste universell istpaste
erhält-
(Standardeingabe) als Standard, zumindest auf meinempaste (GNU coreutils) 8.22
."\0"
, alsopaste -sd "\0" -
für mich gearbeitet!Ah, die Kraft und Einfachheit!
Ändern Sie das Komma " , " nach Belieben. Beachten Sie, dass dies ein "nachfolgendes Komma" enthält.
quelle
\n
, wird dies ebenfalls ersetzt.ls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/'
sed
könnten ein wenig effizienter mit demls -1 | tr "\\n" "," | sed 's/,$//'; echo ''
sed
aftertr
scheint nur das letzte Symbol zu entfernen, was unvernünftig erscheint. Ich gehe mitls -1 | tr '\n' ',' | head -c -1
Dies ersetzt das letzte Komma durch eine neue Zeile:
ls -m
Enthält Zeilenumbrüche am Zeichen für die Bildschirmbreite (z. B. 80.).Meistens Bash (nur
ls
extern):Verwenden von
readarray
(akamapfile
) in Bash 4:Vielen Dank an gniourf_gniourf für die Vorschläge.
quelle
mapfile
(Bash ≥4) als :mapfile -t files < <(ls -1)
. Keine Notwendigkeit, damit herumzuspielenIFS
. Und es ist auch kürzer.IFS
die Felder verbinden :saveIFS=$IFS; IFS=,; list=${files[*]}; IFS=$saveIFS
. Oder verwenden Sie eine andere Methode, wenn Sie ein Trennzeichen mit mehr als einem Zeichen möchten.Ich finde das großartig
ORS ist das "Trennzeichen für Ausgabedatensätze", sodass Ihre Zeilen jetzt mit einem Komma verbunden werden.
quelle
" OR "
) verwendet werdenDie Kombination aus Einstellung
IFS
und Verwendung von"$*"
kann tun, was Sie wollen. Ich verwende eine Subshell, damit ich das $ IFS dieser Shell nicht störeUm die Ausgabe zu erfassen,
quelle
set
? Sieht für mich ein bisschen nach Voodoo aus. Ein flacher Blickman set
brachte mir auch nicht viele Informationen ein.set
eine Reihe von Argumenten, aber keine Optionen angeben, werden die Positionsparameter festgelegt ($ 1, $ 2, ...).--
ist zum Schutz da,set
falls das erste Argument (oder in diesem Fall der Dateiname) mit einem Bindestrich beginnt. Siehe die Beschreibung der--
Option inhelp set
. Ich finde die Positionsparameter eine bequeme Möglichkeit, eine Liste von Dingen zu handhaben. Ich hätte dies auch mit einem Array implementieren können:output=$( files=(*); IFS=,; echo "${files[*]}" )
type set
Sie sagen werden ,set is a shell builtin
. Also,man set
wird nicht helfen, wird aberhelp set
tun. Antwort: "- Weisen Sie den Positionsparametern alle verbleibenden Argumente zu."set -- *
. Wenn Sie die Erweiterung um*
eine Ebene verzögern, erhalten Sie möglicherweise die richtige Ausgabe, ohne dass eine Sub-Shell erforderlich ist :IFS=',' eval echo '"$*"'
. Das ändert natürlich die Positionsparameter.Das Parsen wird
ls
im Allgemeinen nicht empfohlen , daher ist es alternativ besser zu verwendenfind
, zum Beispiel:Oder mit
find
undpaste
:Aktivieren Sie für das allgemeine Verknüpfen mehrerer Zeilen (nicht mit dem Dateisystem verbunden) Folgendes: Prägnantes und portables "Verknüpfen" in der Unix-Befehlszeile .
quelle
Das Rad nicht neu erfinden.
Es macht genau das.
quelle
ls -m
undtr
entfernen Sie das Leerzeichen nach dem Komma, das Sie tun würdenls -m | tr -d ' '
sed 's/, /,/g
nur schlagen
quelle
|
, @camh.bash
undprintf
printf -v
nur in Bash, während die vorgestellte Antwort auf vielen Shell-Typen funktioniert.|
, vorausgesetzt, beide Zeilen werden verwendet :printf -v mystring "%s|" * ; echo ${mystring%|}
.Dieser Befehl ist für die PERL-Fans:
Hier ist 40 der oktale ASCII-Code für den Raum.
-p verarbeitet zeilenweise und druckt
-l wird dafür sorgen, dass das nachfolgende \ n durch das von uns bereitgestellte ASCII-Zeichen ersetzt wird.
-e soll PERL informieren, dass wir die Befehlszeilenausführung durchführen.
0 bedeutet, dass tatsächlich kein Befehl ausgeführt werden muss.
perl -e0 ist dasselbe wie perl -e ''
quelle
Um mögliche Verwirrung bei Zeilenumbrüchen für tr zu vermeiden, können wir ls das Flag -b hinzufügen:
quelle
Es sieht so aus, als ob die Antworten bereits existieren.
Wenn Sie
a, b, c
formatieren möchten , verwenden Siels -m
( Antwort von Tulains Córdova )Oder wenn Sie
a b c
Format möchten , verwenden Siels | xargs
(vereinfachte Version von Chris Js Antwort )Oder wenn Sie ein anderes Trennzeichen wie möchten
|
, verwenden Siels | paste -sd'|'
(Anwendung der Antwort von Artem )quelle
Zusätzlich zur Antwort von Majkinetor können Sie nachfolgend das nachfolgende Trennzeichen entfernen (da ich seine Antwort noch nicht einfach kommentieren kann):
Entfernen Sie einfach so viele nachfolgende Bytes, wie Ihr Trennzeichen zählt.
Ich mag diesen Ansatz, weil ich Trennzeichen mit mehreren Zeichen + andere Vorteile von
awk
:BEARBEITEN
Wie Peter bemerkt hat, wird die negative Byteanzahl in der nativen MacOS-Version von head nicht unterstützt. Dies kann jedoch leicht behoben werden.
Installieren Sie zuerst
coreutils
. "Die GNU Core Utilities sind die grundlegenden Dienstprogramme zur Datei-, Shell- und Textmanipulation des GNU-Betriebssystems."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 verwenden,
ghead
was eine negative Byteanzahl hat, oder besser Alias erstellen:quelle
Der sed Weg,
Hinweis :
Dies ist linear in seiner Komplexität und wird nur einmal ersetzt, nachdem alle Zeilen an den Musterraum von sed angehängt wurden.
@ AnandRajasekas Antwort und einige andere ähnliche Antworten, wie hier , sind O (n²), da sed jedes Mal ersetzen muss, wenn eine neue Zeile an den Musterraum angehängt wird.
Vergleichen,
quelle
Wenn Ihre Version von xargs das Flag -d unterstützt, sollte dies funktionieren
-d ist das Trennzeichen
Wenn Sie -d nicht haben, können Sie Folgendes versuchen
Mit dem ersten xargs können Sie Ihr Trennzeichen angeben, das in diesem Beispiel ein Komma ist.
quelle
-d
Gibt das Eingabetrennzeichen mit GNU xargs an, funktioniert also nicht. Das zweite Beispiel zeigt das gleiche Problem wie andere Lösungen eines Streubegrenzers am Ende.Erläuterung:
-e
- bezeichnet einen auszuführenden Befehl:a
- ist eine Bezeichnung/$/N
- definiert den Umfang der Übereinstimmung für die aktuelle und die (N) ext-Zeiles/\n/\\n/;
- ersetzt alle EOL durch\n
ta;
- gehe zu Bezeichnung a, wenn die Übereinstimmung erfolgreich istEntnommen aus meinem Blog .
quelle
Sie können verwenden:
quelle
ls
Erzeugt eine Spaltenausgabe, wenn es an ein Rohr angeschlossen ist, sodass das-1
redundant ist.Hier ist eine weitere Perl-Antwort mit der integrierten
join
Funktion, die kein abschließendes Trennzeichen hinterlässt:Das Obskure
-0777
lässt Perl alle Eingaben lesen, bevor das Programm ausgeführt wird.sed Alternative, die kein nachfolgendes Trennzeichen hinterlässt
quelle
ls
hat die Möglichkeit-m
, die Ausgabe durch", "
ein Komma und ein Leerzeichen zu begrenzen .Wenn Sie dieses Ergebnis weiterleiten
tr
, um entweder das Leerzeichen oder das Komma zu entfernen, können Sie das Ergebnis erneut weiterleitentr
, um das Trennzeichen zu ersetzen.In meinem Beispiel ersetze ich das Trennzeichen
,
durch das Trennzeichen;
Ersetzen Sie ihn
;
durch ein beliebiges Zeichenbegrenzer, da tr nur das erste Zeichen in den Zeichenfolgen berücksichtigt, die Sie als Argumente übergeben.quelle
Mit chomp können Sie mehrere Zeilen in einer Zeile zusammenführen:
perl -e 'while (<>) {if (/ \ $ /) {chomp; } print;} 'bad0> test
Setzen Sie die Zeilenumbruchbedingung in die if-Anweisung. Dies kann ein Sonderzeichen oder ein beliebiges Trennzeichen sein.
quelle
Schnelle Perl-Version mit Trailing Slash Handling:
Erklären:
quelle