perl正则表达式不匹配字符串与换行符\ n

时间:2013-02-16 01:09:52

标签: regex perl

我正在尝试通过Kubuntu(GNU / Linux)中的bash shell(GNU Bash-4.2)使用perl(v5.14.2)来搜索和替换包含换行符的字符串,但我没有成功爱好。

这是我正在搜索的文本文件:

<!-- filename: prac1.html -->

hello
kitty

blah blah blah

当我使用文本编辑器(Kate)的搜索和替换功能或使用正则表达式测试器(http://regexpal.com/)时,我可以轻松地使用此正则表达式:

hello\nkitty

但是在命令行中使用perl时,以下命令都没有起作用:

perl -p -i -e 's,hello\nkitty,newtext,' prac1.html
perl -p -i -e 's,hello.kitty,newtext,s' prac1.html
perl -p -i -e 's,hello.*kitty,newtext,s' prac1.html
perl -p -i -e 's,hello[\S\s]kitty,newtext,' prac1.html
perl -p -i -e 's,hello[\S\s]*kitty,newtext,' prac1.html

实际上,我绝望并尝试了许多其他模式,包括所有这些模式(“单行”和“多行”模式中的不同排列):

perl -p -i -e 's,hello\nkitty,newtext,' prac1.html
perl -p -i -e 's,hello.kitty,newtext,' prac1.html
perl -p -i -e 's,hello\nkitty,newtext,s' prac1.html
perl -p -i -e 's,hello.kitty,newtext,s' prac1.html
perl -p -i -e 's,hello\nkitty,newtext,m' prac1.html
perl -p -i -e 's,hello.kitty,newtext,m' prac1.html
perl -p -i -e 's,hello\nkitty,newtext,ms' prac1.html
perl -p -i -e 's,hello.kitty,newtext,ms' prac1.html

perl -p -i -e 's,hello[\S\s]kitty,newtext,' prac1.html
perl -p -i -e 's,hello[\S\s]*kitty,newtext,' prac1.html
perl -p -i -e 's,hello$[\S\s]^kitty,newtext,' prac1.html
perl -p -i -e 's,hello$[\S\s]*^kitty,newtext,' prac1.html
perl -p -i -e 's,hello[\S\s]kitty,newtext,s' prac1.html
perl -p -i -e 's,hello[\S\s]*kitty,newtext,s' prac1.html
perl -p -i -e 's,hello$[\S\s]^kitty,newtext,s' prac1.html
perl -p -i -e 's,hello$[\S\s]*^kitty,newtext,s' prac1.html
perl -p -i -e 's,hello[\S\s]kitty,newtext,m' prac1.html
perl -p -i -e 's,hello[\S\s]*kitty,newtext,m' prac1.html
perl -p -i -e 's,hello$[\S\s]^kitty,newtext,m' prac1.html
perl -p -i -e 's,hello$[\S\s]*^kitty,newtext,m' prac1.html
perl -p -i -e 's,hello[\S\s]kitty,newtext,ms' prac1.html
perl -p -i -e 's,hello[\S\s]*kitty,newtext,ms' prac1.html
perl -p -i -e 's,hello$[\S\s]^kitty,newtext,ms' prac1.html
perl -p -i -e 's,hello$[\S\s]*^kitty,newtext,ms' prac1.html

(我也尝试过使用\ r \ n \ n \ n \ R \ f \ D等,以及全局模式。)

有人能发现问题或建议解决方案吗?

2 个答案:

答案 0 :(得分:10)

尝试这样做,我通过修改输入记录分隔符(默认情况下换行)来实现此目的:

perl -i -p00e 's,hello\nkitty,newtext,' prac1.html

来自perldoc perlrun

  

-0 [八进制/十六进制]

     

将输入记录分隔符($ /)指定为八进制或十六进制   数。如果没有数字,则空字符是分隔符。   其他开关可以在数字之前或之后。例如,如果你   有一个版本的find可以打印由终止的文件名   null字符,你可以这样说:

find . -name '*.orig' -print0 | perl -n0e unlink
     

特殊值00将导致Perl以段落模式隐藏文件。   任何值0400或更高将导致Perl整个文件,但是   约定值0777是通常用于此目的的值。

答案 1 :(得分:6)

问题是“-p”已经隐式地将这个循环包裹在你的“-e”和“&lt;&gt;”之间将输入分成行,所以你的正则表达式永远不会有机会看到多行。

 LINE:
       while (<>) {
           ...             # your program goes here
       } continue {
           print or die "-p destination: $!\n";
       }

有关详细信息,请参阅perlrun联机帮助页。