2

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

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

4 回答 4

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 =>$/ = ""; # input record separator set to paragraph mode
  • -l =>$\ = "\n\n"; # output record separator set to $/
于 2013-10-21T16:12:32.770 回答
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.
于 2013-10-22T22:04:31.767 回答
1

chomp()当正则表达式匹配任何带有非空白字符的行时,尝试最后一个换行符:

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

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

perl -pe 'm/\S/ ? chomp() : print "\n"; END { print "\n" }' infile
于 2013-10-21T16:20:53.310 回答
0

\n 是唯一内容的行。表示至少两个连续的换行符。

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

一个示例 python 文件

import re

mystring = """sjdfkj

adlfklk 
dlkfl """ 

print re.sub(r"(?:[^\r\n])\n(?:[^\r\n])"," ",mystring)
于 2013-10-21T16:31:17.080 回答