正则表达式多行匹配在子文件夹(一个衬垫)中递归

时间:2011-07-12 17:25:29

标签: regex linux perl sed awk

我目前使用以下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

1 个答案:

答案 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

(注意结果的开头有一个空行。我相信也很容易修复。)

这样的东西你在找什么?