2014-09-27 47 views
1

我有內容的文件:由空行分隔加入組

aaa bbb ccc 
jjj kkkk llll qqqq 
www ee rrrr 

kkkk oooo ppp wwww 
kk aaa dd 

aa eee tttt 

我想得到以下輸出:

aaa bbb ccc jjj kkk llll qqqq www ee rrrr 
kkkk oooo ppp wwww kk aaa dd 
aa eee tttt 

注意,空行分隔行的各塊,並且每個塊內的新行被空間替換。

我的解決辦法是非常難看,我通過由分離器代替空行開始如「|」,然後用空格替換所有換行符,最後替換分隔符「|」換行。有沒有人對此問題採取更優雅的解決方案?

回答

3

它可以與awk容易實現:

awk -v RS= '{gsub(/\n/, " "); print}' file 
aaa bbb ccc jjj kkkk llll qqqq www ee rrrr 
kkkk oooo ppp wwww kk aaa dd 
aa eee tttt 

這裏-v RS=集記錄分隔符,以使讀AWK多行(直到出現一個空行),其爲單獨的記錄空字符串。

更新:更簡單的awk可以是:(感謝@jaypal

awk -v RS= '{$1=$1}1' file 
+0

非常簡單和乾淨!它也適用於Mac! – 2014-09-27 05:53:15

+0

是的,我自己在OSX上測試過它。 – anubhava 2014-09-27 05:54:22

+0

@AvinashRaj:非常感謝,現在糾正它。 – anubhava 2014-09-27 07:00:25

1

您也可以使用這個sed命令,

sed ':a ;N;/\n$/{P;d;t} ; s/\n/ /g ; t a' File_name 

說明:

N   - Getting two lines 
s/\n/ /g - replace newline to space 
: a and ta - Execute the loop and append each and every line . 
       (So every line become a single line). 
/\n$/  - matching end with new line then break the loop and and start from the first . 
{P,d,t}  - print the pattern space First line and delete the pattern space and start 
       the loop 
+0

這工作。你能解釋一下這個sed的工作嗎?順便說一下,在Mac上,應該使用sed的GNU版本。 – 2014-09-27 05:54:52

+0

@xeon與GNU簡單的版本'sed'將'sed的 ':一個; N;/\ n $/BA; S/\ n// G' file' – 2014-09-27 05:59:44

+0

@xeon:是OSX默認'sed'沒」不得不使用'gsed'。但即使如此也沒有什麼問題:1.顯示的第一條記錄是「qqqqwww ee rrrr」而不是「qqqq www ee rrrr」。2.如果記錄之間有多條空行,則顯示空行。我想它需要在sed命令中改爲'/ \ n// g',但空行仍然存在,以防其中有多個。 – anubhava 2014-09-27 06:00:26

2

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

sed ':a;N;/\n./s/\n/ /;ta;P;d' file 
0

通過perl的,

perl -i -00pe 's/(?<!\n)\n(?!\n)/ /g; s/\n\n/\n/g' file