Hợp nhất các dòng thành một dòng


7

Tôi có một tập tin như thế này:

< 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 

>

Tôi cần sửa đổi nó để nó trông giống như:

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

Tất cả mọi thứ giữa <>phải nằm trên cùng một dòng. Tôi có thể làm cái này như thế nào?


Xin chào và chào mừng đến với trang web. Vui lòng sử dụng các công cụ định dạng để định dạng các tệp ví dụ của bạn dưới dạng mã. Tôi đã chỉnh sửa câu hỏi của bạn thành những gì tôi nghĩ bạn muốn nói, nhưng vui lòng đảm bảo rằng tôi đã không phạm sai lầm nào.
terdon

<br>một phần thực sự của tập tin của bạn?
terdon

không..tôi đã thay đổi nó
Naresh

Câu trả lời:


6

Với 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ếu bạn muốn có một dòng trống giữa mỗi đầu ra, bạn có thể thêm một bổ sung \ncho ORStức là

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

(mặc dù điều này cũng có thể thêm một dòng trống ở cuối tập tin).


Nếu tôi muốn có khoảng trống giữa mỗi dòng .. làm thế nào trong trường hợp đó
Naresh

@Naresh xin vui lòng xem câu trả lời cập nhật - lưu ý rằng @StephaneChazelas đẹp sedcâu trả lời không bị các ký tự dòng mới thêm
steeldriver

nhưng tôi nhận được tất cả các dòng trong một dòng.
Naresh

Tôi có tập tin ở cùng định dạng, khi tôi sử dụng lệnh này, tôi sẽ nhận được mọi thứ trong một dòng ...
Naresh

Tôi đã thay đổi định dạng theo tệp của mình .. vui lòng giúp tôi về điều này
Naresh

3

Của bạn đây:

Dành cho (GNU sed) :

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

Dành cho (BSD sed) :

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

Đây là cách tôi đã thực hiện:

  • Tạo nhãn thông qua :x
  • Nối các dòng vào không gian mẫu với N
  • Nhánh tới nhãn đã tạo - xở đầu lệnh - $!bxvì vậy nó sẽ không áp dụng thay thế liên quan đến không gian trên dòng cuối cùng vì chúng ta nên giữ dòng mới cuối cùng
  • Sau đó, sự thay thế thay thế mọi dòng mới bằng một khoảng trắng ( ) trên không gian mẫu
  • Và sau đó, một sự thay thế khác thay thế mỗi <theo sau bởi một khoảng trắng với một dòng mới theo sau là a <.

1
Trong GNU sed, <biểu thức cuối cùng cần phải được bỏ qua Tôi nghĩ tức là 's/ </\'$'\n</g'hoặc chỉ 's/ </\n</g'(nếu không nó được coi là một ranh giới từ chứ không phải là một nghĩa đen <)
Steeldo

@steel ấn vâng, bạn hoàn toàn đúng, cảm ơn bạn đời. Tôi đang cập nhật câu trả lời của tôi.
FarazX

3

Có vẻ như trong thực tế, bạn muốn xóa tất cả các ký tự dòng mới ngoại trừ những ký tự theo sau >, vì vậy:

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

sẽ làm. (?<!...)là một cái nhìn tiêu cực đằng sau toán tử. Vì vậy, nó \nmiễn là nó không đi trước a >.

Nếu đó là để xóa tất cả các ký tự dòng mới nằm giữa <...>các cặp khớp theo mẫu mới của bạn, các ký tự đó có thể lồng nhau, thì điều đó trở nên phức tạp hơn:

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

Ở đây sử dụng đệ quy trong regexps perl ( (?0)đề cập đến toàn bộ regrec một lần nữa).


1

Sử dụng awk, pastesed

awk '/</{a=1}/>/{print;a=0}a' file | paste -d "" -s | sed 's/></>\n</g'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.