用perl替换两个字符串之间的所有文本,包括换行符

时间:2016-05-21 03:50:34

标签: regex perl replace newline

我有几百个自述文件,它们遵循特定的格式。我需要用不同的内容替换每个文本中的一大块文本。一切都很好,但如果单词之间有换行符\n,我就无法选择单词。一个例子如下:

...
this
is

old


content
...

我想替换这些文件中的所有文字,使它们看起来像这样

...
new content
...

我尝试了以下perl命令,但它们不适用于换行符

perl -pi -w -e 's/this(\n|.)*?content/new content/g;' *.txt

我尝试添加基于https://stackoverflow.com/a/226601/4975772的/ s标记(也许我做错了..)

perl -pi -w -e 's/this(\n|.)*?content/new content/gs;' *.txt

没有“?”

perl -pi -w -e 's/this(\n|.)*content/new content/g;' *.txt

使用(。+?)代替({n}。)基于Regex to match any character including new lines

perl -pi -w -e 's/this(.+?)*content/new content/g;' *.txt

使用[\ s \ S]而不是{\ n |。)基于Regex to match any character including new lines

perl -pi -w -e 's/this[\s\S]*content/new content/g;' *.txt

我在regexpal.com中尝试过这些表达,据说它们运行得很好。

regexpal example

如果我从自述文件中删除换行符,则一切都适用于这些示例perl命令的所有。我做错了什么?

1 个答案:

答案 0 :(得分:3)

您想要添加0777。所以你的单线应该是。

perl -0777 -pi -e 's/this.*?content/new content/sg;' *.txt

0777是一种愚蠢的模式。它将整个文件传递到$_

中的脚本

这等于local $/;

 open my $fh,"<","file";
 local $/;
 my $s = <$fh>;

此处整个文件将存储到$s中。

然后,无需在模式中添加\n。因为s修饰符允许.匹配任何字符,包括换行符。