2011-07-05 65 views
4

我有一個文件就是喜歡刪除新行,如果下一行不以數字開頭

 
    1 test 
    test 

如何刪除新行從這樣最終的輸出變爲:

1 test test

我已經嘗試過一些sed,但我無法正常工作。

+0

你可以用'tr'像'TR「\ n ''' Rahul

+0

但我怎麼ch eck如果下一行沒有開始寬度數字?然後刪除以前的換行符。所有的事情可以分開,但我不能把它們結合起來。 – justahuman

回答

3

如果以數字開頭(第一行除外),您可以更智能一些,並在行前打印新行;

awk 'BEGIN{ORS="";} NR==1 { print; next; } /^[[:digit:]]/ { print "\n"; print; next; } { print; }' 

awk的腳本:

BEGIN { ORS=""; }       # default: no newline between output records 
NR==1 { print; next; }      # first line: print 
/^[[:digit:]]/ { print "\n"; print; next; } # if starts with a digit: print newline before 
{print;}            # other lines (next; has not been called yet) 
-1

使用 'sed的' A溶液:

輸入文件(infile中):

1 test 
test 
2 two 
3 three 
4 four 
five 
six 
7 seven 
eight 
9 nine 

'桑達' 程序(script.sed ):

/[0-9]\+/ { 
     : a 
     N 
     /\n[0-9]\+/ { 
       P 
       s/.*\n// 
     } 
     t a 
} 

y/\n//

執行:

$ sed -f script.sed infile 

輸出:

1 test test 
2 two 
3 three 
4 four five 
six 
7 seven eight 
9 nine 
0

這是非常簡單的使用sed來完成。考慮下面

$ cat numbered      
1 abc 
def 
ghi 
2 jkl 
mno 
3 pqr 
4 stu 
vxw 

命令sed '/^[0-9]/{N; s/\n/ /;}' numbered文件就可以了:

$ sed '/^[0-9]/{N; s/\n/ /;}' numbered 
1 abc def 
ghi 
2 jkl mno 
3 pqr 4 stu 
vxw 

它是如何工作的:首先,如果當前行不以數字開頭它驗證:

/^[0-9]/ 

/^[0-9]/address並僅匹配以數字開頭的行。如果某行與它匹配,則地址後面的命令將被執行。

在這種情況下,該命令是一個{,它打開一個函數列表。函數列表將聚合兩個或更多的命令,就好像它們只有一個一樣。在這種情況下,我們在函數列表中有兩個命令。第一個是在N命令:

N 

此命令追加一個新行和下一行的模式空間。在當前週期後,下一行將不再考慮。下一個命令是s///其通過空間替換換行符:

s/\n//

因此,通過所附N換行符將由空間來代替。然後,我們只需要關閉功能列表}。其結果將是:

/^[0-9]/{ 
    N 
    s/\n//
} 

既然我已經把所有的命令在一行爲了簡潔,功能列表中的命令應該用分號來分隔:

/^[0-9]/{N;s/\n/ /;} 

注意,如果線路出發由一位數字跟隨以數字開頭的另一行,下一行將加入前一行,並且該命令將應用於該行。

5

這應該做的伎倆:

sed -n '$!{ 1{x;d}; H}; ${ H;x;s|\n\([^0-9]\)| \1|g;p}' inputfile 

輸入:

1 test1 
test1 
2 test2 
test2 
test2 
3 test3 
4 test4 

輸出:

1 test1 test1 
2 test2 test2 test2 
3 test3 
4 test4 
+2

令人印象深刻的簡潔 – Bohemian

+0

這個腳本如何被修改,以便代替數字,下一行可以是任何模式 –

+0

如果給出命令的解釋,這個答案會大大改善(如@ brandizzi的) – davemyron

相關問題