Perl 删除\n文件中文本段落内的内容

Perl 删除\n文件中文本段落内的内容,perl,sed,awk,text-processing,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 lectu

假设我有一个包含多个段落的文件,类似于

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
我确实需要保留段落之间的空格。

换行符/换行符替换为空格字符

perl -00 -lpe 's|\r?\n| |g' file
下面是开关的简要说明,以及去火花源


perl-MO=Deparse-00-lpe的|\r?\n | | g”文件
开始{$/=”;$\=“\n\n”}见下文
行:while(已定义($){p开关
chomp$;#也可以是-l开关
s/\r?\n//g;
}
继续{
打印$p开关
}
  • -00=>
    $/=“#”输入记录分隔符设置为段落模式
  • -l=>
    $\=“\n\n”\输出记录分隔符设置为$/
当正则表达式匹配具有非空字符的任何行时,尝试
chomp()
最后换行:

perl -pe 'chomp if m/\S/' infile 
编辑:要在段落和最后换行符之间保留一个空行,请尝试以下操作:

perl -pe 'm/\S/ ? chomp() : print "\n"; END { print "\n" }' infile
其中\n是唯一内容的行。 表示至少两个连续的换行符

你可以很容易地用正则表达式完成。正则表达式模式应该是(?:[^\r\n])\n(?:[^\r\n])

示例python文件

import re

mystring = """sjdfkj

adlfklk 
dlkfl """ 

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

无需将整个文件读入内存:

$ 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.

@加文·辛普森:你需要解释一下一个班轮吗?我想我应该自学,所以请回答!
$ 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.