Die Frage besagt ausdrücklich, dass Titel Leerzeichen enthalten. Zur Sicherheit gehe ich davon aus, dass Titel Punkte (Punkte) enthalten können; zB „Die Geschichte von 3.14159“ oder „Dr. Doolittle Entdeckung “. Meine Antworten gehen davon aus, dass es einen Charakter gibt, der niemals im Inhaltsverzeichnis erscheinen wird. Sie gehen davon aus, dass dies der Fall ist @
. Wenn Sie @
in Ihrer Tabelle, ersetzen Sie es mit einem gewissen Charakter, der nie erscheint (zB #
, ^
, _
, |
, etc.). Wenn Sie wirklich alle ASCII-Zeichen verwenden, müssen Sie möglicherweise eine Zeichenfolge wie <@>
.
Drei Möglichkeiten, dies mit zu tun sed
:
Schleife:
sed 's/\(.*\)\( \)/\1@\2/; :loop; s/ @/ @./; t loop; s/@//'
s/\(.*\)\( \)/\1@\2/
findet das letzte Leerzeichen in der Zeile und fügt ein @
davor ein. :loop
ist ein Etikett, wie eine Meilenmarke. s/ @/ @./
(das heißt s/␣␣@/␣@./
, für Mehrdeutigkeit) sagt, wenn vor dem zwei Leerzeichen vorhanden sind @
, ersetzen Sie diese durch ␣.
(Leerzeichen und Punkt) und verschieben Sie sie @
zwischen ihnen. t loop
sagt, wenn die obige Ersetzung erfolgreich war, springe zurück zum :loop
Marker und wiederhole es. Ansonsten fahren Sie fort mit s/@//
, die das entfernt @
.
Die foo bar
Zeile in Ihrer Tabelle wird also wie folgt verarbeitet:
Anfangswert: foo bar url3 s / \ (. * \) \ (\) / \ 1 @ \ 2 / foo bar @ url3 s / @ / @. / foo bar @. url3 s / @ / @. / foo bar @ .. url3 s / @ / @. / foo bar @ .. url3 ( Ersetzung schlägt fehl, schleife also nicht) s / @ // foo bar .. url3 Endgültige Ausgabe: foo bar .. url3
Überwältigende Zahlen:
sed 's/\(.*\)\( \)/\1@@@@@@@@@@@@@@@@@@@@\2/; s/ [ @]\/ /; s/@/./g'
s/\(.*\)\( \)/\1@@@@@@@@@@@@@@@@@@@@\2/
ist dem ersten s
Unterbefehl in der ersten Lösung sehr ähnlich ; Es findet das letzte Leerzeichen in der Zeile und fügt eine Zeichenfolge von 20 @
Zeichen ein. Dies sollte eigentlich eine Zahl sein, die mindestens so groß ist wie die maximale Anzahl von Punkten, die Sie jemals in eine Zeile einfügen müssen. zB 80. Das Verwalten einer Zeichenfolge von 80 @
Zeichen wäre umständlich. Möglicherweise möchten Sie dies durch ersetzen s/\(.*\)\( \)/\1<@><@><@><@><@>\2/; s/<@>/@@@@@@@@/g
Dadurch wird eine Folge von fünf <@>
Sequenzen eingefügt und dann jede von ihnen durch eine Folge von 16 @
Zeichen ersetzt, die 5 × 16 = 80 @
Zeichen ergibt .
s/ [ @]\/ /
findet eine Zeichenfolge von 20 aufeinanderfolgenden Zeichen, die entweder ein Leerzeichen oder ein @
Leerzeichen sind, und ein Leerzeichen vorangestellt wird, und ersetzt es nur durch das vorangehende Leerzeichen. Ersetzen Sie 20
die Nummer aus dem vorherigen Schritt. s/@/./g
ersetzt jedes verbleibende @
durch einen Punkt.
Die foo
Zeile in Ihrer Tabelle wird also wie folgt verarbeitet:
Initial value: foo url1 s/\(.*\)\( \)/\1@@@@...@@@@\2/ foo @@@@@@@@@@@@@@@@@@@@ url1 s/ [ @]\/ / _[↑↑↑↑↑↑remove↑↑↑↑↑↑] foo @@@@@@ url1 s/@/./g foo ...... url1
Nutzen Sie den "Hold Space":
sed 's/.*[^ ] /&@/; h; s/ /./g; s/\(\.*\)\./\1 /; x; G; s/@.*@//'
s/.*[^ ] /&@/
ist ähnlich zu den vorherigen Befehlen; es findet das Ende des Titels - genauer gesagt, die letzte Stelle, an der ein nicht-leeres Zeichen ein Leerzeichen folgt - und fügt ein @
nachher ein. h
kopiert die Zeile in den Speicherplatz. s/ /./g
ersetzt alle Leerzeichen in der Zeile durch Punkte. s/\(\.*\)\./\1 /
ersetzt den letzten Punkt durch ein Leerzeichen. (Dies muss geändert werden, wenn die URL Punkte enthalten kann, was wahrscheinlich wahrscheinlich ist.) x
tauscht den Pattern-Space und den Hold-Space aus. G
Hängt den Haltebereich an den Musterbereich an. Wir haben jetzt im Wesentlichen zwei Exemplare der Zeile. s/@.*@//
behält den ersten Teil der ersten Kopie und den zweiten Teil der zweiten Kopie, wobei der Inhalt in der Mitte entfernt wird.
Initial value: foo bar url3 Pattern space Hold space s/.*[^ ] /&@/ foo bar @ url3 h foo bar @ url3 foo bar @ url3 s/ /./g foo.bar.@...url3 foo bar @ url3 s/\(\.*\)\./\1 / foo.bar.@.. url3 foo bar @ url3 x foo bar @ url3 foo.bar.@.. url3 G foo bar @ url3 foo.bar.@.. url3 foo.bar.@.. url3 s/@.*@// foo bar .. url3 foo.bar.@.. url3 Final output: foo bar .. url3