2013-10-07 49 views
2

我在尋找sed只解決方案如下:附加一個行結束到下一個的開始與sed的

損壞輸入:

A 123 dgbsdgsbg 
A 345 gsgsdgdgs A 23 
2 afaffaaf 
A 324 fsgdggsdg A 345 avsa 
fasf 

預期輸出:

A 123 dgbsdgsbg 
A 345 gsgsdgdgs 
A 232 afaffaaf 
A 324 fsgdggsdg 
A 345 avsafasf 

尾部A [0-9].*如何被追加到下一行的開頭。到目前爲止,我有:

$ sed -r 's/ (A [0-9]+.*)/\n\1/' file 
A 123 dgbsdgsbg 
A 345 gsgsdgdgs 
A 23 
2 afaffaaf 
A 324 fsgdggsdg 
A 345 avsa 
fasf 
+1

的Et恩,[sudo_O](http://stackoverflow.com/help/badges/1562/sed的?用戶id = 1066031)? – devnull

+1

@devnull這是一種問題,我的大腦切換到'awk',超出替代以及其他一些技巧,我的'sed'知識不能傳播。 –

回答

3

這可能會爲你工作(GNU SED):

sed -r '$!N;s/ (A[^\n]*)\n/\n\1/;P;D' file 
+0

小心解釋'$!N'和'P; D'? –

+0

@sudo_O'$!N'表示如果不是文件結尾,則在模式空間中追加換行符('\ n')和下一行到當前行。 「P」表示直到第一個換行符或模式空間的結尾,其中第一個換行符或D'刪除幷包括第一個換行符或直到模式空間的結尾,這是先到達的。如果在模式空間中存在換行符,那麼'D'將導致下一行的自動讀入,然後它將被刪除,直到找不到換行符。 – potong

3

這可以是一個選項:

$ sed -r ':a;$!N;s/ (A [0-9]+.*)\n(.*)/\n\1\2/;ta;P;D' file 
A 123 dgbsdgsbg 
A 345 gsgsdgdgs 
A 232 afaffaaf 
A 324 fsgdggsdg 
A 345 avsafasf 

這是最後一個例子,從How to match newlines in sed的適應:

sed ':begin;$!N;s/FOO\nBAR/FOOBAR/;tbegin;P;D' 
# if a line ends in FOO and the next starts with BAR, join them 
3

你嘗試:

sed -e :a -e '$!N;s/\([0-9]\)\n\([0-9]\)/\1\2/;ta' -e 'P;D' 

例如:

$ cat input 
abc 123 
456 
def 
123 
ghi 123 
jkl 456 
789 
$ sed -e :a -e '$!N;s/\([0-9]\)\n\([0-9]\)/\1\2/;ta' -e 'P;D' input 
abc 123456 
def 
123 
ghi 123 
jkl 456789 

編輯:你修改了問題後面的例子。對於修改後的輸入,嘗試:

$ sed -e 's/ \(A .*\)/\n\1/' -e :a -e '$!N;s/\n\([^A]\)/\1/;ta' -e 'P;D' newinput 
A 123 dgbsdgsbg 
A 345 gsgsdgdgs 
A 232 afaffaaf 
A 324 fsgdggsdg 
A 345 avsafasf 
相關問題