2013-10-21 26 views
2

說我有多個段落相似地帶 n

Lorem ipsum dolor sit amet. Velit et ornare feugiat ve fringilla adipiscing, non 
augue risus, eleifend. Laoreet a, taciti porttitor mus. Erat leo metus 
venenatis. Natoque eni, nunc quis elit est. Nec enim dui. Sem parturient lectus, 
sed, egestas. Amet nascetur quisque, nonummy amet ut odio proin hymenaeos sit, 
consequat proin hymenaeos vestibulum. Duis ad penatibus natoque, fames nec amet 
eni inceptos. Ligula orci scelerisque laoreet, massa leo dictumst feugiat 
praesent varius netus suspendisse. Et et quis volutpat quam, aenean sit, magnis 
integer ad luctus hendrerit per. Lectus adipiscing nascetur quisque consectetuer 
feugiat etiam eros. Natoque massa. Semper ut nam tortor. Odio ut nullam mus, 
sociis at, luctus aliquet at odio habitant fames. 

Penatibus ipsum lacus blandit ad dis ante dolor. Cursus porta penatibus 
facilisi. Nisl erat rutrum primis dis elit dolor penatibus pretium duis 
sollicitudin ut. Sed urna leo massa cubilia eget, elementum mus. Ve metus ac 
vitae at litora tincidunt id, ac hac. Dis justo nullam. Fames sollicitudin, 
augue ve at. Tristique. Primis convallis praesent, eget. Nullam, penatibus ut, 
proin non mus id nascetur dis, lorem arcu. Magna urna nascetur ornare, nunc 
proin quisque cum, pharetra. Quisque, litora eu lobortis diam eros. Vel mi 
hymenaeos ipsum in. Ligula curabitur ve, magnis hymenaeos euismod. 

被處理的降價文件,你可以看到在周圍有虛線所生成的文件的文件80個字符。使用Perl或sed或awk(我正在運行Linux,因此可以使用任何解決方案,但我不是Python或Ruby用戶的很多人),我怎樣才能取消在段落內斷行

我知道如何從整個文件中去除\n,但是這會將兩段顯示爲一條連續的線條。我不想那樣。我只想一次操作一個段落,所以任何解決方案都應該跳過只有\n是唯一內容的行。

我使用的文件使用Unix/Linux文件結尾,即換行符,因此只有\n存在。 我確實需要保留段落之間的空格。

回答

4

符/換行符被替換爲空間炭,

perl -00 -lpe 's|\r?\n| |g' file 

這裏是開關的簡要說明,並deparsed源


perl -MO=Deparse -00 -lpe 's|\r?\n| |g' file 
BEGIN { $/ = ""; $\ = "\n\n"; }  # see below 
LINE: while (defined($_ = <ARGV>)) { # -p switch 
    chomp $_;      # also -l switch 
    s/\r?\n/ /g; 
} 
continue { 
    print $_;      # -p switch 
} 
  • -00 =>$/ = ""; # input record separator set to paragraph mode
  • -l =>$\ = "\n\n"; # output record separator set to $/
+0

謝謝,更新完美! –

+0

@GavinSimpson你需要解釋一個班輪嗎? –

+0

我想我應該教育自己,所以是的請! –

1

嘗試chomp()最後換行符當正則表達式與非空白字符的任何行匹配:

perl -pe 'chomp if m/\S/' infile 

編輯:爲了保持段落和最後的換行符之間的空行,嘗試以下內容:

perl -pe 'm/\S/ ? chomp() : print "\n"; END { print "\n" }' infile 
+0

謝謝,編輯的例子也很好。 –

0

線其中\ n是唯一的內容。 意味着至少兩個連續的換行字符。

你可以很容易地用正則表達式。甲正則表達式。將(?:[^ \ r \ n])的\ n(?:[^ \ r \ n])的

樣品蟒文件

import re 

mystring = """sjdfkj 

adlfklk 
dlkfl """ 

print re.sub(r"(?:[^\r\n])\n(?:[^\r\n])"," ",mystring) 
1

而不必讀取整個文件到內存:

$ cat file 
Lorem ipsum dolor sit amet. Velit et ornare feugiat ve fringilla adipiscing, non 
augue risus, eleifend. Laoreet a, taciti porttitor mus. Erat leo metus 
venenatis. Natoque eni, nunc quis elit est. 

Penatibus ipsum lacus blandit ad dis ante dolor. Cursus porta penatibus 
facilisi. Nisl erat rutrum primis dis elit dolor penatibus pretium duis 
sollicitudin ut. Sed urna leo massa cubilia eget, elementum mus. Ve metus ac 
vitae at litora tincidunt id, ac hac. Dis justo nullam. 

$ awk -v RS= -v ORS='\n\n' -F'\n' '{$1=$1}1' file 
Lorem ipsum dolor sit amet. Velit et ornare feugiat ve fringilla adipiscing, non augue risus, eleifend. Laoreet a, taciti porttitor mus. Erat leo metus venenatis. Natoque eni, nunc quis elit est. 

Penatibus ipsum lacus blandit ad dis ante dolor. Cursus porta penatibus facilisi. Nisl erat rutrum primis dis elit dolor penatibus pretium duis sollicitudin ut. Sed urna leo massa cubilia eget, elementum mus. Ve metus ac vitae at litora tincidunt id, ac hac. Dis justo nullam.