Kann man mit einem gängigen Befehlszeilenprogramm wie sed oder awk alle Zeilen verbinden, die mit einem bestimmten Zeichen enden, wie z. B. einem Backslash?
Zum Beispiel angesichts der Datei:
foo bar \
bash \
baz
dude \
happy
Ich möchte diese Ausgabe erhalten:
foo bar bash baz
dude happy
text-processing
awk
sed
perl
Cory Klein
quelle
quelle
cpp
:)sed
FAQAntworten:
Eine kürzere und einfachere Lösung:
oder einzeilig bei Verwendung von GNU
sed
:quelle
sed
:) ... Sie hängen jede Zeile direkt an den Musterraum an, und wenn eine "normal endende" Zeile vorkommt, folgt die Der gesamte Musterbereich fällt durch und wird automatisch gedruckt (da es keine Option -n gibt) ... ordentlich! .. +1sed -e :a -e '/\\$/N; s/\\\n//; ta'
Mit Perl ist es möglicherweise am einfachsten (da Perl wie sed und awk ist, hoffe ich, dass es für Sie akzeptabel ist):
quelle
Ist hier eine awk Lösung. Wenn eine Zeile mit einem
\
endet, entfernen Sie den umgekehrten Schrägstrich und drucken Sie die Zeile ohne abschließende neue Zeile. Andernfalls drucken Sie die Zeile mit einem abschließenden Zeilenumbruch.Es ist auch nicht schlecht in sed, obwohl awk offensichtlich besser lesbar ist.
quelle
Dies ist keine Antwort als solche. Es handelt sich um ein Nebenthema
sed
.Insbesondere musste ich das Gilles-
sed
Kommando Stück für Stück auseinander nehmen, um es zu verstehen ... Ich fing an, einige Notizen darüber zu schreiben, und dachte dann, dass es hier für jemanden nützlich sein könnte ...also hier ist es ... Gilles 'sed- Skript in dokumentiertem Format:
quelle
Ein weiteres gebräuchliches Befehlszeilentool ist das
ed
, das Dateien standardmäßig direkt ändert und daher die Dateiberechtigungen unverändert lässt (weitere Informationen findened
Sie unter Bearbeiten von Dateien mit dem Texteditor ed aus Skripten ).quelle
Verwenden der Tatsache, dass
read
in der Shell umgekehrte Schrägstriche interpretiert werden, wenn sie ohne Folgendes verwendet werden-r
:Beachten Sie, dass dies auch alle anderen umgekehrten Schrägstriche in den Daten interpretiert .
quelle
a\\b\\\\\\\\\\\c
Eine einfache (r) Lösung, die die gesamte Datei in den Speicher lädt:
Oder eine noch kurze, die das Verstehen von (Ausgabe-) Zeilen (GNU-Syntax) unterstützt:
In einer Zeile (POSIX-Syntax):
Oder benutze awk (wenn die Datei zu groß ist, um in den Speicher zu passen):
quelle
Die auf der @ Giles-Lösung basierende Mac-Version würde so aussehen
Wenn der Hauptunterschied darin besteht, wie Zeilenumbrüche dargestellt werden, und wenn weitere Zeilen zu einer Zeile zusammengefasst werden, wird der Unterschied aufgehoben
quelle
Sie können cpp verwenden, aber es entstehen einige leere Zeilen, in denen die Ausgabe zusammengeführt wird, und eine Einführung, die ich mit sed entferne. Vielleicht kann dies auch mit cpp-Flags und Optionen geschehen:
quelle
cpp
es eine Lösung gibt? In Ihrem Beispiel gibt dieecho
Zeichenfolge mit Anführungszeichen bereits gerichteten Text aus,cpp
ist also sinnlos. (Dies gilt auch für Ihrensed
Code.) Wenn Sie die Zeichenfolge in einfache Anführungszeichen setzen,cpp
nur die umgekehrten Schrägstriche entfernt, die Zeilen jedoch nicht verkettet. (Die Verkettung mitcpp
würde funktionieren, wenn vor den Backslashes kein Leerzeichen wäre, aber dann würden die einzelnen Wörter ohne Trennzeichen verbunden.)cpp
so etwas verketten sich die Zeilen für mich noch nicht. Und die Verwendung vonsed
ist definitiv unnötig. Verwendungcpp -P
: "-P
Generierung von Linemarken in der Ausgabe des Präprozessors unterbinden." - man cppcpp: “-P: No such file or directory cpp: warning: '-x c' after last input file has no effect cpp: unrecognized option '-P:' cpp: no input files
Acpp --version
verrätcpp (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
- was? Ubuntu patcht cpp? Warum? Ich hätte erwartet, GNU zu lesen ...cpp
verkettet tatsächlich die Zeilen und hinterlässt einige Leerzeichen. Noch interessanter ist, dass dieselbe Version 4.4.3-4ubuntu5.1 hier akzeptiert-P
. Es werden jedoch nur die Linienmarkierungen entfernt, die leeren Linien bleiben erhalten.