Mesclar linhas em uma única linha

6

Eu tenho um arquivo como este:

< 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 

>

Eu preciso modificá-lo para que pareça:

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

Tudo entre < e > deve estar na mesma linha. Como posso fazer isso?

    
por Naresh 27.07.2016 / 20:36

4 respostas

5

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

Se você quiser uma linha em branco entre cada saída, você pode adicionar um \n extra ao ORS , ou seja,

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

(embora isso também possa adicionar uma linha em branco no final do arquivo).

    
por 27.07.2016 / 21:05
3

Aqui você está:

Para (GNU sed) :

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

Para (BSD sed) :

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

Foi assim que eu fiz:

  • Crie um marcador por meio de :x
  • Anexe as linhas ao espaço de padrão com N
  • Ramifique para o rótulo criado - o x no primeiro do comando - $!bx , para não aplicar a substituição associada ao espaço na última linha, já que devemos manter a última nova linha
  • Em seguida, a substituição substitui cada nova linha por um espaço ( ) no espaço de padrão
  • E, em seguida, outra substituição substitui todos os < seguidos por um espaço com uma nova linha, seguido por um < .
por 27.07.2016 / 21:01
3

Parece que você deseja remover todos os caracteres de nova linha, exceto aqueles que seguem um > , então:

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

faria. (?<!...) é um aspecto negativo por trás do operador. Então, é \n desde que não seja precedido por > .

Se for para remover todos os caracteres de nova linha que estão entre <...> pares e , conforme a nova amostra, eles podem se aninhar, então isso se torna mais complicado:

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

Aqui, usando recursão em expressões regulares de perl ( (?0) refere-se ao regexp inteiro novamente).

    
por 27.07.2016 / 21:06
1

Usando awk , paste e sed

awk '/</{a=1}/>/{print;a=0}a' file | paste -d "" -s | sed 's/></>\n</g'
    
por 27.07.2016 / 21:05