Wie kann ich Leerzeichen in einer Eingabe durch neue Zeilen ersetzen?
/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5
usw...
So erhalten Sie Folgendes:
/path/to/file
/path/to/file2
/path/to/file3
/path/to/file4
/path/to/file5
Hinweis
Ich poste diese Frage, um anderen Benutzern zu helfen. Unter UNIX SE war es nicht einfach, eine nützliche Antwort zu finden, bis ich mit der Eingabe dieser Frage begann. Danach habe ich folgendes gefunden:
Verwandte Frage
bash
text-processing
string
Laconbass
quelle
quelle
Antworten:
Verwenden Sie den
tr
BefehlGefunden unter http://www.unix.com/shell-programming-scripting/67831-replace-space-new-line.html
quelle
tr
ist!In diesem Fall würde ich printf verwenden:
Wenn es Plätze sind innerhalb des einen des Weges, können Sie diesen Dateipfad , um zitieren zu verhindern , dass es auf den Räumen aufgeteilt werden:
Das Transformieren von Text im Allgemeinen
tr
ist Ihre beste Wahl, wie in einer vorhandenen Antwort beschrieben.quelle
Angenommen, Sie haben eine Zeichenfolge mit Leerzeichen als Trennzeichen:
Allerdings stellen Sie wahrscheinlich die falsche Frage. (Nicht unbedingt, zum Beispiel kann dies in einem Makefile vorkommen.) Eine durch Leerzeichen getrennte Liste von Dateinamen funktioniert nicht wirklich: Was passiert, wenn einer der Dateinamen Leerzeichen enthält?
Wenn ein Programm Dateinamen als Argumente erhält, dürfen Sie diese nicht mit Leerzeichen verbinden. Verwenden Sie
"$@"
, um nacheinander darauf zuzugreifen. Obwohlecho "$@"
die Argumente mit Leerzeichen dazwischenecho
gedruckt werden, ist dies auf Folgendes zurückzuführen : Die Argumente werden mit Leerzeichen als Trennzeichen gedruckt.somecommand "$@"
Übergibt die Dateinamen als separate Argumente an den Befehl. Wenn Sie die Argumente in separaten Zeilen drucken möchten, können Sie verwendenWenn Sie über durch Leerzeichen getrennte Dateinamen verfügen und diese in ein Array einfügen möchten, um sie zu bearbeiten, können Sie den Wert mithilfe einer nicht in Anführungszeichen gesetzten Variablenerweiterung nach Zeichen aufteilen
IFS
(Sie müssen die Platzhaltererweiterung mit deaktivierenset -f
, andernfalls glob Muster werden im Wert erweitert):Sie können dies in eine Funktion einkapseln, die die
-f
Einstellung und den Wert von " Fertig" wiederherstelltIFS
:quelle
set -f
undIFS
lesen Sie das Bash-Handbuch, wenn Sie alle Details erfahren möchten. Siehe auch unix.stackexchange.com/questions/16192/…IFS
Ort wird nicht wirksamSei pragmatisch, benutze sed !!
Oben steht, um ein oder mehrere Whitespace-Zeichen (\ s +) durch eine neue Zeile (\ n) zu ersetzen.
Das ist mehr oder weniger:
quelle
Alternativ zu
tr
@laconbass können Siexargs
in diesem Fall auch Folgendes verwenden :Der Vorteil ist, dass es auch mit mehreren Leerzeichen
tr
funktioniert , was nicht der Fall ist.quelle
So habe ich es gemacht:
Beachten Sie die Verwendung der Eingabetaste nach dem Backslash im
sed
Befehl.quelle
sed
dastr
?sed
da es sich um einen Editor handelt, anstatt nur Zeichen zu übersetzen.sed
kann so viel mehr, ist dafür aber total übertrieben.tr
ist das richtige Werkzeug für DIESEN Job, aber Kenntnissesed
und reguläre Ausdrücke werden sich sicherlich später als nützlich erweisen!Ein anderer Ansatz, vorausgesetzt, die Zeile befindet sich in einer Variablen mit dem Namen
line
:Dies macht sich die Tatsache
echo
zunutze , dass Bash seine Argumente standardmäßig in Leerzeichen aufteilt und standardmäßig eine neue Zeile an seine Eingabe anfügt.quelle
ist eine weitere Methode, um durch Leerzeichen getrennte Wörter in durch Zeilenumbrüche getrennte Wörter umzuwandeln.
quelle
Das folgende Skript ist leicht zu verstehen und leicht zu verwenden.
quelle
tr
) ist dieselbe wie in der akzeptierten Antwort. Außerdem hat Ihre Antwort folgende Probleme: a) Der Befehl wird nicht mit 4 Leerzeichen eingerückt (-> Abschriftenlayout). B) Ihre Verwendung voncat
ist nutzlos (Sie können es durch ersetzen< filename tr ' ' '\n'
). c) Ihr Ausgabedateiname ist der gleiche wie der Eingabedateiname. Damit erstellen Sie ein Datenrennen.