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?


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).


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 <.

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).


1

Unter Verwendung awk, pasteundsed

awk '/</{a=1}/>/{print;a=0}a' file | paste -d "" -s | sed 's/></>\n</g'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.