我有几百个自述文件,它们遵循特定的格式。我需要用不同的内容替换每个文本中的一大块文本。一切都很好,但如果单词之间有换行符\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中尝试过这些表达,据说它们运行得很好。
如果我从自述文件中删除换行符,则一切都适用于这些示例perl命令的所有。我做错了什么?
答案 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
修饰符允许.
匹配任何字符,包括换行符。