2014-06-20 132 views
1

我有一些段落在行尾有回报。我不想在行尾输入回报,我会让布局程序处理这个问题。我想删除退货,并用空格替换它们。更改段落的格式,使用perl

问题是我希望段落之间的回报。所以,如果连续有多个回报(2,3等),我想保留两个回报。

这将允许有段落,其间有一条空行,但是所有其他格式的行将被删除。这将允许布局程序担心换行符,而不是像现在一样由一定数量的字符确定中断。

我想使用Perl来完成这个改变,但我可以使用其他方法。

示例文本:

This is a test. 
This is just a test. 

This too is a test. 
This too is just a test. 

将成为:

This is a test. This is just a test. 

This too is a test. This too is just a test. 

可以这样很容易做到?

+0

是的,这可以很容易地完成。你有没有编写任何代码?你遇到麻烦了吗? StackOverflow不是免费的编码服务。 – chilemagic

+0

我的经验水平有限。我曾尝试过: – CS3000911

+0

perl -p -i -e's /(\ w + | \ s +)[\ r \ n]/$ 1/g'abc.txt 问题与我在下面尝试的例子。它看起来应该比现在做得更多。在这种情况下,它会为所有退货添加空格,但不会删除退货。 – CS3000911

回答

0

我想出了另一种解决方案,也想解释你的正则表达式匹配。

[email protected] ~/perl/testing/8 
$ cat input.txt 
This is a test. 
This is just a test. 

This too is a test. 
This too is just a test. 



another test. 
test. 

[email protected] ~/perl/testing/8 
$ perl -e '$/ = undef; $_ = <>; s/(?<!\n)\n(?!\n)/ /g; s/\n{2,}/\n\n/g; print' input.txt 
This is a test. This is just a test. 

This too is a test. This too is just a test. 

another test. test. 

我基本上只是写了一个Perl程序,并将其捣碎成一个班轮。它通常看起来像这样。

# First two lines read in the whole file 
$/ = undef; 
$_ = <>; 

# This regex replaces every `\n` by a space 
# if it is not preceded or followed by a `\n` 
s/(?<!\n)\n(?!\n)/ /g; 

# This replaces every two or more \n by two \n 
s/\n{2,}/\n\n/g; 

# finally print $_ 
print; 

perl -p -i -e 's/(\w+|\s+)[\r\n]/$1 /g' abc.txt 

这里的部分问题是你匹配的东西。 (\w+|\s+)匹配多个单词字符中的一个,它与[a-zA-Z0-9_],相同,但与空格字符相同,与[\t\n\f\r ]相同。

这与您的输入不匹配,因为您不是匹配句点,也没有行仅包含空格或仅包含字符(即使空白行需要两个空格字符以匹配它,因为我们有[\r\n] at结束)。另外,两者都不符合一个时期。

+0

您可以使用以下开关简化您的一个班轮:'perl -0777 -pe's /(?<!\ n)\ n(? !\ n)//g; S/\ N {2,}/\ n \ N /克;” input.txt' – Miller

1

使用perl单线程。与刚刚2.剥去取代2次或更多的换行所有单一换行符:

perl -0777 -pe 's{(\n{2})\n*|\n}{$1//" "}eg' file.txt > newfile.txt 

交换机

  • -0777:吸食整个文件
  • -p:创建一个while(<>){...; print}循环为每个“线”在您的输入文件中。
  • -e:通知perl在命令行上执行代码。
+0

我不确定这是否是使用非标准返回的问题,但运行上述脚本的结果不会删除行末处的返回,从而使段落基本上成为一行。我没有看到我对此使用的文字有任何改变。 这是在linux机器上使用。我试着用和不用-0777,但结果似乎是一样的。有没有可能出现这样的问题:无论出于何种原因,perl没有注册返回,因为它在某种程度上是非标准的? – CS3000911

+0

如果您认为回车问题可能会成为问题,那么您可以尝试将对上述'\ n'的任何引用更改为'(?:\ r?\ n)'。但是,我提供的示例数据对我的系统提供的单线式工作很好。 – Miller

+0

我想我最初已经很累了:perl -0777 -pe's /(\ n {2})\ n * | \ n/$ 1/g'。当我使用:perl -0777 -pe's {(\ n {2})\ n * | \ n} {$ 1 //“”} eg',我等于所有的回报,但不会消除回报。 – CS3000911