在文件的文本段落中删除\ n

时间:2013-10-21 16:09:10

标签: perl sed awk text-processing

假设我有一个包含类似

的多个段落的文件
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.

该文件是通过处理markdown文件生成的,正如您所看到的,该文件有大约80个字符的虚线。使用Perl或sed或awk(我运行Linux所以可以使用任何解决方案,但我不是Python或Ruby用户),如何撤消段落中行的断行?

我知道如何从整个文件中删除\n,但这会将两个段落显示为单个不间断的行。我不希望这样。我只是想一次操作一个段落,所以任何解决方案都应该跳过\n是唯一内容的行。

我使用的文件使用Unix / Linux文件结尾,即换行,因此只有\n存在。 我确实需要保留段落之间的空格。

4 个答案:

答案 0 :(得分:4)

中断/换行符用空格字符

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

以下是开关和解压缩源的简要说明


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 =&gt; $/ = ""; # input record separator set to paragraph mode
  • -l =&gt; $\ = "\n\n"; # output record separator set to $/

答案 1 :(得分:1)

当正则表达式匹配任何包含非空字符的行时,请尝试chomp()上一个换行符:

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

编辑:要在段落和最终换行符之间留一个空行,请尝试以下操作:

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

答案 2 :(得分: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.

答案 3 :(得分:0)

  

其中\ n是唯一内容的行。   意味着至少有两个连续的换行符。

您可以使用正则表达式轻松完成。正则表达式模式是(?:[^ \ r \ n])\ n(?:[^ \ r \ n])

示例python文件

import re

mystring = """sjdfkj

adlfklk 
dlkfl """ 

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