如何在Windows草莓Perl命令行实现正则多行点匹配替换
解决Windows草莓Perl多行正则替换问题
嘿,作为Perl新手碰到这种跨多行匹配的坑太正常了,我来给你一步步捋明白怎么解决!
你的问题核心有两个:一是默认的-p参数会逐行处理文件,跨换行的内容根本没机会被匹配;二是Perl正则默认的.字符不包含换行符,就算能读到多行也匹配不上换行。
直接给你能用的命令
在Windows命令行里,你需要这样修改:
perl -0777 -pe "s/text.*end/textChanged/gs" myFile.txt
拆解每个关键部分的作用
-0777:这个参数让Perl把整个文件一次性读入内存,而不是逐行处理。这样$_变量里就包含了文件的所有内容(包括所有换行符),正则就能匹配跨多行的片段了。/s修饰符:开启"单行模式"(这里的命名有点反直觉),让正则中的.字符匹配包括换行符在内的所有字符,这样text.*end就能覆盖中间的换行内容了。/g修饰符:如果你需要替换文件中所有符合条件的片段(而不只是第一个),这个修饰符就必不可少;如果只需要替换第一个,可以去掉它。- 引号注意:Windows的cmd命令行不识别单引号作为字符串边界,所以必须用双引号把Perl的替换脚本
"s/text.*end/textChanged/gs"包起来,否则会报错。
可选优化:非贪婪匹配
如果你发现替换的时候不小心把从第一个text到最后一个end的所有内容都替换了(这是因为.*是贪婪匹配),可以把.*改成.*?,用非贪婪匹配来匹配到最近的end:
perl -0777 -pe "s/text.*?end/textChanged/gs" myFile.txt
为啥原来的命令不行?
你之前用的perl -pe 's/text.*end/textChanged/g' myFile.txt有两个局限:
-p默认逐行读取文件,每一行单独处理,跨多行的text和end根本不在同一个$_里,自然匹配不到。- 没有加
/s修饰符,.只能匹配除换行符外的字符,就算能读到多行,也没法覆盖换行的部分。
内容的提问来源于stack exchange,提问作者user1139359
相关产品推荐
相关产品推荐

