我目前使用以下Perl one liner来在子文件夹之间递归地匹配文件中的多行。除了强制您使用 .
匹配 \n
之外,它才有效。但我需要使用 \n
,因为 .
也会匹配任何字符。
使用Perl one衬垫有没有办法做到这一点?一个衬垫与其他Linux程序怎么样?
perl -i -pe 'BEGIN{undef $/;} s/FIND/REPLACE/smg' $(find "/PATH-TO-DIRECTORY" -name "*.html" -type f)
编辑:
正则表达式: \ thello world!....
Regex: \ thello world!\ n \ n \ n \ n
测试示例:
hello world!
hello world!
foo
答案 0 :(得分:1)
我创建了一个目录和文件树,这将导致以下情况:
$ cat $(find a -type f)
EFabcd
EFbacA
QuuxQuuxr
Foobar
abcd
然后,使用sed我认为我得到了你正在寻找的解决方案:
$ sed -n 'H;${x;s/d\nEF/FOO/;p;}' $(find a -type f)
它是如何工作的?首先,我们使用-n
来抑制sed的输出。然后是命令。对于每一行,我们将换行符和行的内容附加到保留空间:
H
在文件的末尾,它将保留空间的内容带到模式空间(可以进行替换):
x
在此之后,我们将所有文件的所有内容视为唯一的一行。现在我们可以替换包含新行的模式,例如:
s/d\nEF/FOO/
应用替换后,我们打印结果:
p
结果:
$ sed -n 'H;${x;s/d\nEF/FOO/g;p;}' $(find a -type f)
EFabcFOObacA
QuuxQuuxr
Foobar
abcd
(注意结果的开头有一个空行。我相信也很容易修复。)
这样的东西你在找什么?