Zeilen zu einer Zeile zusammenführen

7

Ich habe eine Datei wie diese:

< Dec 2, 2015 2:51:49 PM EST> <Error> <HTTP> <cphypprod1v..com> 
<AnalyticProviderServices0> <[ACTIVE] ExecuteThread: '3' for queue: 
'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel> <> <1449085909249> <BEA-

101017> <[ServletContext@462961596[app:bea_wls_deployment_internal 
module:bea_wls_deployment_internal.war path:/bea_wls_deployment_internal spec-

version:null]] Root  ServletException.

java.lang.OutOfMemoryError: GC overhead limit exceeded 

>

< Dec 2, 2015 2:51:49 PM EST> <Warning> <RMI> <cphypprod1v.sherwin.com>   <AnalyticProviderServices0> <[STANDBY] ExecuteThread: '8' for queue:   'weblogic.kernel.Default (self-tuning)'>  
<<WLS Kernel>> <> <> <1449085909264> < BEA-080003> < RuntimeException thrown by  
rmi server: javax.management.remote.rmi.RMIConnectionImpl.invoke 
(Ljavax.management.ObjectName;Ljava.lang.String;Ljava.rmi.Marshal 

>

Ich muss es ändern, damit es so aussieht:

  < Dec 2, 2015 2:51:49 PM EST> <Error> <HTTP> <cphypprod1v..com> <AnalyticProviderServices0> <[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel> <><1449085909249> <BEA-101017> <[ServletContext@462961596[app:bea_wls_deployment_internal module:bea_wls_deployment_internal.war path:/bea_wls_deployment_internal spec-version:null]] Root  ServletException. java.lang.OutOfMemoryError: GC overhead limit exceeded  >

< Dec 2, 2015 2:51:49 PM EST> <Warning> <RMI> <cphypprod1v.sherwin.com>   <AnalyticProviderServices0> <[STANDBY] ExecuteThread: '8' for queue:   'weblogic.kernel.Default (self-tuning)'>  
<<WLS Kernel>> <> <> < 1449085909264> < BEA-080003> < RuntimeException thrown by  rmi server: javax.management.remote.rmi.RMIConnectionImpl.invoke (Ljavax.management.ObjectName;Ljava.lang.String;Ljava.rmi.Marshal >

Alles zwischen <und >muss auf der gleichen Linie sein. Wie kann ich das machen?

Naresh
quelle
Hallo und willkommen auf der Seite. Verwenden Sie die Formatierungswerkzeuge, um Ihre Beispieldateien als Code zu formatieren. Ich habe bearbeitet Ihre Frage an , was ich glaube , Sie wollen, aber stellen Sie sicher , dass ich keine Fehler gemacht.
Terdon
Ist das <br>eigentlich Teil Ihrer Datei?
Terdon
Nein, ich habe es geändert.
Naresh

Antworten:

6

Mit awk

awk 'BEGIN{RS=">\n+";ORS=">\n";FS="\n"} {$1=$1}1' yourfile
< Jan 20, 2016 11:58:09 AM EST  Test1 Sample Test1 >
< Jan 20, 2016 11:58:09 AM EST Sample Test It is not  T1 T2 >

Wenn Sie eine leere Zeile zwischen den einzelnen Ausgaben wünschen, können Sie \ndem ORSdh eine zusätzliche Zeile hinzufügen

awk 'BEGIN{RS=">\n+";ORS=">\n\n";FS="\n"} {$1=$1}1' yourfile

(obwohl dies auch eine nachgestellte Leerzeile am Ende der Datei hinzufügen kann).

Steeldriver
quelle
Wenn ich zwischen den einzelnen Zeilen Platz haben möchte, wie geht das in diesem Fall
?
@ Naresh siehe aktualisierte Antwort - beachten Sie, dass @StephaneChazelas nette sedAntwort nicht unter der zusätzlichen nachgestellten Newline leidet
Steeldriver
aber ich bekomme alle Zeilen in einer Zeile.
Naresh
Ich habe Datei im gleichen Format, wenn ich diesen Befehl benutze, bekomme ich alles in einer Zeile ...
Naresh
Ich habe das Format gemäß meiner Datei geändert. Bitte helfen Sie mir dabei
Naresh
3

Hier sind Sie ja:

Für (GNU sed) :

sed -e ':x' -e 'N' -e '$!bx' -e 's/\n/ /g' -e 's/ </\n</g' yourFile

Für (BSD sed) :

sed -e ':x' -e 'N' -e '$!bx' -e 's/\n/ /g' -e 's/ \</\'$'\n</g' yourFile 

So habe ich es gemacht:

  • Erstellen Sie ein Etikett über :x
  • Hängen Sie die Linien mit an den Musterbereich an N
  • Verzweigen Sie zum erstellten Label - dem xam ersten des Befehls -, $!bxdamit die mit dem Leerzeichen verbundene Ersetzung nicht in der letzten Zeile angewendet wird, da die letzte neue Zeile beibehalten werden soll
  • Dann ersetzt die Ersetzung jede neue Zeile durch ein Leerzeichen ( ) im Musterbereich
  • Und dann ersetzt <eine andere Ersetzung jedes gefolgt von einem Leerzeichen durch eine neue Zeile gefolgt von einem <.
FarazX
quelle
1
In GNU sed muss der <endgültige Ausdruck meiner Meinung nach UNescaped sein, dh 's/ </\'$'\n</g'oder nur 's/ </\n</g'(sonst wird er eher als Wortgrenze als als wörtlich behandelt <)
Steeldriver
@steeldriver ja du hast vollkommen recht, danke Kumpel. Ich aktualisiere meine Antwort.
FarazX
3

Sieht aus wie in der Tat, wollen Sie alle Zeilenumbrüche mit Ausnahme derjenigen entfernen , die eine folgen >, so:

perl -pe 's/(?<!>)\n//'

würdest du. (?<!...)ist ein negativer Blick hinter Betreiber. Es wird also \nvorausgesetzt, dass kein a vorangestellt ist >.

Wenn alle Zeilenumbruchzeichen entfernt werden sollen, die sich zwischen übereinstimmenden <...>Paaren befinden, und gemäß Ihrem neuen Beispiel diese möglicherweise verschachtelt sind, wird dies komplizierter:

perl -0777 -pe 's{<(?:(?0)|[^<>])*>}{$& =~ s/\n//gr}gse'

Hier wird die Rekursion in Perl-Regexps verwendet ( (?0)bezieht sich wieder auf den gesamten Regexp).

Stéphane Chazelas
quelle
1

Unter Verwendung awk, pasteundsed

awk '/</{a=1}/>/{print;a=0}a' file | paste -d "" -s | sed 's/></>\n</g'
Tachomi
quelle