Wenn ich den Befehl ausführe cat file | grep pattern
, erhalte ich viele Ausgabezeilen. Wie verketten Sie alle Zeilen in einer Zeile, effektiv jede ersetzt "\n"
mit "\" "
(Ende mit "
durch Leerzeichen)?
cat file | grep pattern | xargs sed s/\n/ /g
arbeitet nicht für mich.
sed
Skript in einfache Anführungszeichen setzen, damit Bash nicht damit herumspielt (dased s/\n/ /g
Aufrufesed
mit zwei Argumenten, nämlichs/n/
und/g
); (2) da Sie möchten, dass die Ausgabe voncat file | grep pattern
die Eingabe vonsed
und nicht die Argumente von istsed
, müssen Sie eliminierenxargs
; und (3) hier besteht keine Notwendigkeitcat
, dagrep
ein Dateiname als zweites Argument verwendet werden kann. Du hättest es also versuchen sollengrep pattern file | sed 's/\n/ /g'
. (In diesem Fall hätte es aus den unter dem obigen Link angegebenen Gründen nicht funktioniert, aber jetzt wissen Sie es für die Zukunft.)Antworten:
Verwenden Sie
tr '\n' ' '
diese Option, um alle Zeilenumbruchzeichen in Leerzeichen zu übersetzen:Hinweis:
grep
Liest Dateien,cat
verkettet Dateien. Nichtcat file | grep
!Bearbeiten:
tr
kann nur Einzelzeichenübersetzungen verarbeiten. Sie könnenawk
das Trennzeichen für Ausgabedatensätze wie folgt ändern:Dies würde sich verwandeln:
zu:
quelle
echo ""
am Ende hinzufügen, um eine neue Zeile vor dem Aufforderungstext hinzuzufügen."
, zeigt sich, wieone" two" three"
, aber ich es , wie zeigen wollen würdeone" two" three
. Beachten Sie, dass die letzten drei keine Klammern haben. Irgendwelche Ideen?sed '$s/..$//'
, um die letzten 2 Zeichen in der letzten Zeile zu löschen.--delete
Option verwenden, da standardmäßig zwei Argumente erwartet werden. zBtr --delete '\n'
.Wenn Sie die Ausgabe an weiterleiten,
xargs
wird jede Ausgabezeile zu einer einzelnen Zeile mit Leerzeichen verknüpft:Oder irgendein Befehl, z.
ls | xargs
. Die Standardausgabegrenzexargs
beträgt ~ 4096 Zeichen, kann jedoch mit z.xargs -s 8192
.grep xargs
quelle
| tr '\n' ' '
funktionierte nicht für mich, wenn durchphp exec
Funktion aufgerufen . Es ignorierte tr und gab nur das letzte Match von grep.| xargs
hat funktioniert.echo
Entfernen Sie in Bash ohne Anführungszeichen Wagenrückläufe, Tabulatoren und mehrere Leerzeichenquelle
IFS="$(printf '\n\t')"
echo $(<file)
... Echo zu verwenden ist nicht nur ordentlicher als zu verwendentr '\n' ' '
, sondern auch besser (denken Sie an\r\n
Zeilenenden). @aggsol können Sie nur sagenIFS=$'\n\t'
Dies könnte sein, was Sie wollen
Ich bin mir nicht sicher, was es bedeutet, vielleicht das?
(dies setzt voraus, dass
~
dies in nicht vorkommtfile
)quelle
cat file
tatsächlich sein wirdcat
, oder sogar eine Datei. (Ich habe diesen Teil einfach unverändert gelassen, da er für die Frage irrelevant war)Dies ist ein Beispiel, das eine durch Kommas getrennte Ausgabe erzeugt. Sie können das Komma durch ein beliebiges Trennzeichen ersetzen.
produziert:
quelle
Hier ist die Methode mit dem
ex
Editor (Teil von Vim ):J oin alle Linien und p rint auf die Standardausgabe:
J oin alle Linien in-place (in der Datei):
Hinweis: Dadurch werden alle Zeilen in der Datei selbst verkettet!
quelle
Die schnellsten und einfachsten Möglichkeiten, dieses Problem zu lösen:
Wenn wir das neue Zeilenzeichen
\n
durch das Leerzeichen ersetzen möchten :xargs
hat eigene Grenzen für die Anzahl der Zeichen pro Zeile und die Anzahl aller Zeichen zusammen, aber wir können sie erhöhen. Details finden Sie mit diesem Befehl:xargs --show-limits
und natürlich im Handbuch:man xargs
Wenn wir ein Zeichen durch ein anderes ersetzen möchten, genau ein Zeichen :
Wenn wir ein Zeichen durch viele Zeichen ersetzen möchten :
Zuerst ersetzen wir die Zeilenumbruchzeichen
\n
für Tildes~
(oder wählen ein anderes eindeutiges Zeichen, das nicht im Text enthalten ist), und dann ersetzen wir die Tildezeichen durch andere Zeichen (many_characters
) und tun dies für jede Tilde (Flaggeg
).quelle
Der wahrscheinlich beste Weg, dies zu tun, ist die Verwendung des Tools 'awk', mit dem die Ausgabe in einer Zeile generiert wird
Alle Zeilen werden mit einem Leerzeichen in einer Zeile zusammengeführt
quelle
{print}
da es die Standardaktion von awk ist.Unter Red Hat Linux verwende ich nur Echo:
echo $ (cat / some / file / name)
Dies gibt mir alle Datensätze einer Datei in nur einer Zeile.
quelle