2016-11-18 3 views
0

Ich habe eine Datei, die gelegentlich Split-Linien hat.sed: Verbindungslinien abhängig von der vierten

Die Teilung wird durch die Tatsache signalisiert, dass zwei aufeinanderfolgende Zeilen mit alphabetischen Zeichen.

 

5 

00:00:00,000 --> 00:00:00,000 

Alphabetic characters 
Alphabetic characters 

6 

00:00:00,000 --> 00:00:00,000 

Alphabetic characters 

7 

00:00:00,000 --> 00:00:00,000 

Alphabetic characters 
Alphabetic characters 

8 

00:00:00,000 --> 00:00:00,000 

Alphabetic characters 

..... 

Ich möchte die Trennlinie kommen zurück:

 

5 

00:00:00,000 --> 00:00:00,000 

Alphabetic characters Alphabetic characters 

6 

00:00:00,000 --> 00:00:00,000 

Alphabetic characters 

7 

00:00:00,000 --> 00:00:00,000 

Alphabetic characters Alphabetic characters 

8 

> 00:00:00,000 --> 00:00:00,000 

Alphabetic characters Alphabetic characters 
..... 

sed verwenden. Mir ist nicht klar, wie ich mich einer Linie mit der vorhergehenden anschließen soll. Irgendwelche Vorschläge?

+0

Wenn es sich um eine SRT-Datei handelt, gibt es im Gegensatz zu Ihrem Beispiel eine leere Zeile nach der letzten Textzeile (vor dem Untertitelindex). –

+0

können Sie Ihre Frage bearbeiten, weil sie nicht das tatsächliche Format einer gültigen .SRT-Datei widerspiegelt. Daher werden Lösungen, die auf Ihrem Beispiel basieren, nicht zufriedenstellend sein. –

+0

Präfixzeilen mit vier Leerzeichen. Bitte werfen Sie einen Blick auf [editing-help] (http://stackoverflow.com/editing-help). – Cyrus

Antwort

1

sed ist für einfache Subsitutionen auf einzelnen Zeilen, das ist alles. Für alles andere sollten Sie awk werden:

$ awk '/[[:alpha:]]/{ if (buf=="") {buf=$0; next} else {$0=buf OFS $0; buf=""} } 1' file 

5 

00:00:00,000 --> 00:00:00,000 

Alphabetic characters Alphabetic characters 

6 

00:00:00,000 --> 00:00:00,000 


7 

00:00:00,000 --> 00:00:00,000 

Alphabetic characters Alphabetic characters 

8 

00:00:00,000 --> 00:00:00,000 

Alphabetic characters Alphabetic characters 

..... 

Die oben wird kräftig arbeiten, portabel und effizient auf allen UNIX-Systemen mit allen POSIX-kompatiblen awks.

+0

Danke, funktioniert gut für mich. Es ist möglich, Negation Operator? gefällt das -> "nicht gleich [: digit:]" – Marcelo

+0

je nachdem was du meinst, das; s '!/[[: Digit:]] /' or '/ [^ [: digit:]] /' . –

1
sed '$!{N;/^[a-zA-Z ][^\n]\+\n[a-zA-Z ]/{s/\n/ /}}' 

Spiel zwei Linien back-to-back, die die Bedingung, dass die erste Zeile beginnt mit einem alphabetischen Zeichen oder Zwischenraum und die zweiten beginnt mit dem gleichen erfüllen. Begleite sie mit einem Leerzeichen. nächste Zeile zu dem Musterraum gefunden wird, fügen Sie mit dem Befehl N

sed '/^[[:alpha:]]/{N;/\n[[:alpha:]]/s/\n/ /}' file 

Wenn eine Zeile mit Buchstaben beginnen:

+0

Danke, funktioniert gut für mich. – Marcelo

1

Einen anderen Ansatz mit sed. Ersetzen Sie dann Newline, gefolgt von alphabetischen Zeichen mit einem Leerzeichen.

+0

Fantastisch - vielen Dank. funktioniert wirklich gut für mich. – Marcelo

Verwandte Themen