2015-05-06 21 views
0

我可以使用grepsed從文件中刪除空行。但是,我無法解決必須刪除空行旁邊的有效行的情況。以下是一個例子:Shell腳本刪除空行旁邊的一行

來源:

1_1 
1_2 
1_3 
1 
2_1 
2_2 
2_3 
2_4 
2_5 
2 

3 
4_1 
4_2 
4 
5_1 
5_2 
5_3 
5_4 
5 



6 
7_1 
7 
8_1 
8_2 
8 

輸出:

1_1 
1_2 
1_3 
1 
2_1 
2_2 
2_3 
2_4 
2_5 
2 
4_1 
4_2 
4 
5_1 
5_2 
5_3 
5_4 
5 
7_1 
7 
8_1 
8_2 
8 

如何刪除有效的線下一個空行?

+1

這個問題有點不清楚:什麼是你想要刪除的「有效行」?嘗試提供一個更小的例子,除此之外 - 「預期輸出」。 – alfasin

+0

「有效行」是指不爲空的行。 – codedoc

+1

在空白空間(或兩者)之前或之後的「有效行」? 「旁邊的」並不是一個好的定義...「後面的」 – alfasin

回答

5

試着這麼做:

sed '/^$/,+1 d' test.txt 

,只要你找到一個空行,刪除它,下一立即行。

+0

它工作正常!只是爲了好奇,可以通過「grep」來完成嗎? – codedoc

+0

你說你想'刪除空行旁邊的有效行,''有效行'是指不是空行.'所以 - 請注意,不像@Jotne發佈的awk解決方案,上面的sed腳本不會刪除2(或其他偶數個)連續空行後的有效行。那是你想要的嗎? –

2

下面是一個awk溶液:

awk '!NF {f=1;next} f {f=0;next}1' file 
1_1 
1_2 
1_3 
1 
2_1 
2_2 
2_3 
2_4 
2_5 
2 
4_1 
4_2 
4 
5_1 
5_2 
5_3 
5_4 
5 
7_1 
7 
8_1 
8_2 
8 

!NF {f=1;next}如果行是空的,設置f=1並跳過的行。
然後,如果行不爲空,則測試f是否爲真。
{f=0;next}如果其爲真,則設置f=0並跳過該行。
1打印剩餘的行。


有些gofling通過ED做

awk 'NF&&!f;{f=!NF}' file 
+1

'其他awk'awk'f &&NF; {f = NF}'' –

+0

太棒了!兩個作品! – codedoc

+0

只是爲了好奇,可以通過「grep」來完成嗎? – codedoc

1
sed '/^$/ { 
:a 
    N 
    /\n$/ ba 
    d 
    }' YourFile 
  • Posix的版本
  • 刪除所有連續的空行,然後下一個(非空)一個
+0

它工作正常!只是爲了好奇,可以通過「grep」來完成嗎? – codedoc

+0

由於參考下一行/上一行而無法確定。刪除空行是沒有問題的,但不是空行後面的行。也許在GNU版本中使用'-p' perl regex(不是來自posix的'-p'指定了段落分隔符並將其刪除) – NeronLeVelu