将行合并为单行

将行合并为单行

我有一个这样的文件:

< 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 

>

我需要修改它,使其看起来像:

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

<和之间的所有内容>都必须在同一条线上。我怎样才能做到这一点?

答案1

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 >

如果你想在每个输出之间有一个空行,你可以\nORSie中添加一个额外的空行

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

(尽管这也可能在文件末尾添加一个尾随空白行)。

答案2

给你:

对于(GNU sed)

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

对于(BSD sed)

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

我就是这样做的:

  • 通过创建标签:x
  • 将线条附加到模式空间N
  • 分支到创建的标签 -x命令的第一个 -$!bx因此它不会在最后一行应用与空格相关的替换,因为我们应该保留最后一个换行符
  • 然后替换将模式空间上的每个换行符替换为空格()
  • 然后另一个替换将<后跟空格的 every 替换为换行符,后跟<

答案3

看起来实际上,您想要删除除 a 之后的所有换行符>,因此:

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

会做。(?<!...)是一个消极的看后面的运算符。因此,前提是\n它前面没有>.

如果要删除匹配<...>对之间的所有换行符,根据您的新示例,这些可能会嵌套,然后变得更加复杂:

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

这里在 perl 正则表达式中使用递归((?0)再次指整个正则表达式)。

答案4

使用awk,pastesed

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

相关内容