Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用perl更改段落的格式_Perl - Fatal编程技术网

使用perl更改段落的格式

使用perl更改段落的格式,perl,Perl,我有许多段落在一行末尾有返回。我不希望在行尾返回,我会让布局程序处理。我想删除返回值,并用空格替换它们 问题是,我确实希望在段落之间返回。因此,如果一行中有多个退货(2、3等),我希望保留两个退货 这将允许有段落,其间有一个空行,但所有其他行的格式将被删除。这将允许布局程序担心换行符,而不是像现在这样由一组字符决定换行符 我想用Perl来完成这一改变,但我对其他方法持开放态度 示例文本: This is a test. This is just a test. This too is a te

我有许多段落在一行末尾有返回。我不希望在行尾返回,我会让布局程序处理。我想删除返回值,并用空格替换它们

问题是,我确实希望在段落之间返回。因此,如果一行中有多个退货(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.

这很容易做到吗?

使用perl单行程序。用2个换行符替换2个或更多换行符。删除所有单个换行符:

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

  • -0777
    :Slurps整个文件
  • -p
    :为输入文件中的每一行创建
    while(){…;print}
    循环
  • -e
    :告诉
    perl
    在命令行上执行代码
我想出了另一个解决方案,还想解释一下您的正则表达式匹配什么

Matt@MattPC ~/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.

Matt@MattPC ~/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.
这里的部分问题是您匹配的内容
(\w+\s+
匹配多个单词字符中的一个,与
[a-zA-Z0-9.][/code>,一个或多个空白字符相同,与
[\t\n\r]
相同


这与你的输入不匹配,因为你不匹配句点,而且没有一行只包含空白或字符(即使空白行需要两个空白字符来匹配它),因为我们在结尾有<代码> [\r\n] < /代码>。另外,两者都不匹配时段。

是的,这很容易做到。你写过代码吗?你有没有遇到麻烦?StackOverflow不是免费的编码服务。我的经验有限。我曾经尝试过:perl-p-I-e's/(\w+\s+[\r\n]/$1/g'abc.txt这个问题与我在下面尝试的示例基本相同。看起来它应该做得更多。在本例中,它确实为所有返回添加了空格,但没有删除返回。我不确定是否使用了非标准返回是一个问题,但运行上述脚本的结果不是删除行尾的返回,使段落基本上成为一行。我没有看到我用这个来反对的文本有任何变化。这是在linux机器上使用的。我试过使用和不使用-0777,但结果似乎是一样的。问题是否有可能是由于某种原因perl没有注册返回,因为它在某种程度上是非标准的?如果您认为运输返回可能是一个问题,那么您可以尝试将上面对
\n
的任何引用更改为
(?:\r?\n)
。但是我提供的一行程序在我的系统上可以很好地用于您建议的示例数据。我想我最初已经厌倦了:perl-0777-pe's/(\n{2})\n*\n/$1/g。当我使用:perl-0777-pe's{(\n{2})\n*\n}{$1/''}eg'时,我用所有的返回值来设置空格,但不是消除返回值。建议对返回值进行的更改是:perl-0777-pe's{(?:\r?\n{2})\n*\n}{$1/'}eg'test txt>out.txt?我的示例非常简单,可能是造成混淆的原因。下面是这本书的一小段选段。我本来打算再增加一些,但这个例子有一个上限在构思了他划时代的发明之后,他用画笔画了很多年,但他的热情越来越低,兴趣也越来越分散。艺术不再至高无上;发明与她共享王位,并最终剥夺了她的王位。“你的一行代码可以通过切换到:
perl-0777-pe的/(?)来简化?
# 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