Ich mache grep und sed und erhalte 2 Zeilen einer Datei, die mich interessiert. Wie kann ich diese Zeilen in einer einzelnen Zeile erhalten, die mit dem neuen Zeilenzeichen endet?
Jetzt bekomme ich:
pattern1
pattern2
Ich hätte gern pattern1 pattern2 \n
printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'
Antworten:
paste
::Das heißt: "Lies eine Zeile aus stdin (der ersten
-
), lies eine andere Zeile aus stdin (der zweiten-
) und verbinde sie dann mit einem Leerzeichen."eine Bash-spezifische Technik:
Ref: http://www.gnu.org/software/bash/manual/bashref.html#index-mapfile
quelle
- -
? Ist der Befehl so?paste
wie die Eingabe verarbeitet werden soll. 2 auf einmal. Fügen Sie mehr hinzu, um jeweils 3 zu tun.seq 10 | paste -d " " - -
.Ich werde drei Versionen verschiedener Methoden hintereinander setzen
AWK
SED
TR
Und es gibt noch viel mehr.
quelle
tr
Lösung wird die Endung Newline schlucken, so dass Sie hinzufügen möchten; echo
zu , dass manSie können dies mit einem Shell-Skript oder in der Befehlszeile tun. Fügen Sie einfach die Ausgabe des Befehls in eine Variable ein und dann
echo
:quelle
*
oder?
) im Ergebnis haben, können sich die Werte ändern.$()
.. und mit printfprintf '%s\n' "$x"
printf '%s\n' "$x"
die "interne" Newline NICHT entfernt wird.Mit
sed
können Sie dies tun:N;
weistsed
an, die nächste Zeile in den Musterbereich einzufügen, sodass jetztsed
mit beiden Zeilen gearbeitet wird.s/\n/ /
Ersetzt das Zeilenumbruchzeichen durch ein Leerzeichen und "verschmilzt" die beiden Zeilen miteinander.quelle
Ein einfacher Weg, Pipe-Ausgabe an
xargs
:Dies funktioniert nur mit kleinen Ausgaben, da diese durch die maximale Anzahl von Zeichen pro Befehlszeile begrenzt sind. Der größte Wert hängt vom System ab. Sie können diesen Wert mit abrufen
getconf ARG_MAX
.quelle
IFS wird es gerne essen, wenn Sie wollen.
quelle
Wickeln Sie Ihr Sed / Grep in Backticks
als Ihr ursprünglicher Befehl war:
Ihr neuer Befehl wäre:
Erhält nicht die Zwischenräume zwischen den Linien, aber Sie können immer ein anderes sed-Rohr anheften:
quelle