我有一个这样的文件:
< 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 >
如果你想在每个输出之间有一个空行,你可以\n
在ORS
ie中添加一个额外的空行
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
,paste
和sed
awk '/</{a=1}/>/{print;a=0}a' file | paste -d "" -s | sed 's/></>\n</g'