Ich habe die Gewohnheit, eine Zeile pro Satz zu schreiben, weil ich normalerweise Dinge in LaTex kompiliere oder in einem anderen Format schreibe, bei dem Zeilenumbrüche ignoriert werden. Ich verwende eine leere Zeile, um den Beginn eines neuen Absatzes anzugeben.
Jetzt habe ich eine Datei in diesem Stil, die ich nur als einfachen Text senden möchte. Ich möchte alle einzelnen Zeilenumbrüche entfernen, aber die doppelten Zeilenumbrüche intakt lassen. Das habe ich gemacht:
sed 's/$^/NEWLINE/' file.txt | awk '{printf "%s ",$0}' | sed 's/NEWLINE/\n\n/g' > linebreakfile.txt
Dies ersetzt leere Zeilen durch Text, von dem ich sicher bin, dass er nicht in der Datei enthalten ist. NEWLINE
Dann werden alle Zeilenumbrüche mit awk entfernt (ich habe diesen Trick auf einer Website gefunden) und das NEWLINE
s durch die erforderlichen zwei Zeilenumbrüche ersetzt .
Dies scheint ein langwieriger Weg zu sein, um eine ziemlich einfache Sache zu tun. Gibt es einen einfacheren Weg? Wenn es eine Möglichkeit gäbe, mehrere Leerzeichen (die sich manchmal aus irgendeinem Grund einschleichen) durch einzelne Leerzeichen zu ersetzen, wäre dies auch gut.
Ich benutze Emacs. Wenn es also einen Emacs-spezifischen Trick gibt, der gut ist, würde ich lieber eine reine sed- oder reine awk-Version sehen.
tr -d "\n"
.Antworten:
Sie können awk folgendermaßen verwenden:
Oder wenn Sie am Ende einen zusätzlichen Zeilenumbruch benötigen:
Oder wenn Sie die Absätze durch eine neue Zeile trennen möchten:
Diese awk-Befehle verwenden Aktionen, die von Mustern geschützt werden:
oder
Eine folgende Aktion wird nur ausgeführt, wenn das Muster mit der aktuellen Zeile übereinstimmt.
Und die
^$.
Zeichen haben in regulären Ausdrücken eine besondere Bedeutung, wobei sie^
mit dem Zeilenanfang,$
dem Ende und.
einem beliebigen Zeichen übereinstimmen .quelle
/./
Und was macht es: Es scheint sich so zu verhalten undelse
für die/^$/
Stringübereinstimmung, ist das richtig?Verwenden awk oder Perl- Absatz - Modus eine Datei Absatz für Absatz zu verarbeiten, wobei die Absätze durch Leerzeilen getrennt sind.
Da dies das (La) TeX nicht parst, werden Kommentare, wörtliche Umgebungen und andere spezielle Syntax schrecklich beschädigt. Möglicherweise möchten Sie sich mit DeTeX oder anderen (La) TeX-zu-Text-Konvertern befassen .
quelle
Sed Solution
Beachten Sie, dass in dieser Lösung
:a
ein Label erstellt wird und dera
Befehl nicht verwendet wird .Mehrere Leerzeichen ersetzen
Verwendung
tr
:$ tr -s ' ' <test.text
quelle
Wenn ich richtig verstanden habe, impliziert eine leere Zeile zwei aufeinanderfolgende Zeilenumbrüche
\n\n
.Wenn ja, wäre eine mögliche Lösung, alle singulären Vorkommen von Zeilenumbrüchen zu beseitigen.
In Perl ist eine Lookahead-Behauptung eine Möglichkeit, dies zu erreichen:
-0777
Flag schlürft effektiv die gesamte Datei in eine einzige Zeichenfolge-p
Weist Perl an, die Zeichenfolge zu drucken, an der standardmäßig gearbeitet wird-i
Gibt die direkte Bearbeitung anquelle
(Wiederbelebung einer alten Frage)
Dies scheint genau das zu sein, was
fmt
undpar
sind für - Absatz Neuformatierung. Wie Sie (und auch wie viele andere Programme) definieren sie Absatzgrenzen als eine (oder mehrere) Leerzeilen. Versuchen Sie, Ihren Text durch eine dieser Zeilen zu leiten.fmt
ist ein Standard-Unix-Dienstprogramm und kann in GNU Coreutils gefunden werden.par
ist ein stark verbesserterfmt
Text von Adam M. Costello, der unter http://www.nicemice.net/par/ zu finden ist (er wurde auch für verschiedene Distributionen, einschließlich Debian, gepackt - ich habe ihn für Debian im Januar 1996 gepackt). obwohl es jetzt einen neuen Betreuer für das pkg gibt.).quelle
sed
Fügt eine Zeile an einH
altes Leerzeichen an, das mindestens ein einzelnes Zeichen enthält. Es werden sofortd
alle gelöscht , mit Ausnahme des letzten. Die einzigen Linien , die können , sind Rohlinge bleiben, und es ist auf diesen Linien , wennsed
ex
die Halt und Musterräume und löscht alle kumulierten Änderungen\n
ewline Zeichen.Wenn Sie möchten, dass Zeilen, die nur <Tabulatoren> oder <Leerzeichen> enthalten , als leer betrachtet werden, ersetzen Sie die
/./
obige Adresse durch/[^[:blank:]]/
. Gehen Sie wie folgt vor, um auch Leerzeichen zu komprimieren:quelle
Nachdem ich Gilles 'Perl- und awk-Kompaktbeispiele gesehen hatte, wollte ich das nicht posten, aber ich hatte die Übung bereits durchgearbeitet, und es ist ein funktionierendes Skript, das hinreichend dokumentiert ist. Dieser Punkt allein kann für einige von Interesse sein .. (mit Kommentaren sed! :)
In diesem Skript werden leere Zeilen auch dann als leer betrachtet, wenn sie Leerzeichen enthalten.
Mehrere Leerzeichen im Text werden zu einem einzigen Leerzeichen zusammengefasst.
Nachgestellte Leerzeichen werden aus den Textzeilen entfernt. Aufeinanderfolgende Leerzeilen werden zu einer einzigen Zeile zusammengefasst. Das Skript lässt die oberen und unteren Leerzeilen intakt.
Für mehr als die einfachsten Skripte kann sed viel einfacher in strukturierter Form als separate Skriptdatei geschrieben werden. Hier ist ein solches Beispiel.
Verwenden des erweiterten Regex-Syntaxaufrufs
: $ sed -rf Skript-Textdatei
Hinweis:
flush
In den Kommentaren bedeutet dies: Sende den Pattern-Space an seds interne Standardverarbeitung. Es bedeutet nicht, dass es sich um einen bestimmten Ausdruck handelt. Die Ausgabe ist abhängig von der-n
Option von sed . z.B. Derq
Befehl bedeutet " Flush" und "Quit ". Vergleichen Sie diese beiden Ausschnitte:echo x |sed -e q
druckt x,echo x |sed -ne q
druckt nichts, während die Verwendung desp
Befehls je nach-n
Option "x" zweimal oder einmal ausgeben würde.quelle
Hier ist noch eine andere
sed
Lösung, die alle Zeilen zused
"hold space" verkettet, so dass wir eine lange Zeichenfolge erhalten, die schließlich für den Mustervergleich in den "pattern space" kopiert wird.Da Zeilenumbrüche in der letzten langen Zeichenfolge im
sed
"Musterbereich" erhalten bleiben , können leere Zeilen in Form von doppelten Zeilenumbrüchen[^\n]\n\n[^\n]
abgeglichen und geändert werden[^\n]\n[^\n]
.Weitere Informationen finden Sie beispielsweise unter sed und Multi-Line Search and Replace .
quelle
Das könnte alte Schule sein:
Dadurch wird Ihr Text linksbündig (
.ad l
) mit einer Zeilenlänge von 80 (.ll 80
) ausgegeben . Die Seitenlängenoption (.pl
) weist die Textverarbeitung an, das Seitenauffüllen für eine Seitenlänge von 1 durchzuführen, sodass kein Seitenauffüllen erfolgt.Wenn Sie möchten, dass alle Absätze in einer einzigen Zeile stehen, können Sie eine große Zahl verwenden für
.ll
:Mann 7 groff für weitere Formatierungsoptionen.
quelle
In Emacs verwende ich manchmal Folgendes
regex
:Meint:
quelle
Es stellt sich heraus, dass mit
auto-fill-mode
on emacs für meine einfachen Anwendungsfälle mit nurM-q
...quelle
auto-fill-mode
passiert, hängen davon ab, welchen Hauptmodus Sie aktiviert haben.