regex - 如何在命令行中使用 perl 替换正则表达式多行 dotall
问题描述
嗨,我是使用 perl 的新手,我想知道如何在多行模式下使用它来替换正则表达式。如果可能的话,还制作“。” 与断线匹配。
我正在使用以下表达式:
perl -pe 's/text.*end/textChanged/g' myFile.txt
上面的表达式以单行模式替换。它不考虑折线。
使用:Windows 草莓 Perl
解决方案
请注意,Perl one-liner 使用 -p 或 -n 开关,它在幕后包装了一个 while 循环。而 while 循环使用逐行读取的标量上下文,因此除非text.*end
出现在单行中,否则您将看不到输出中的任何更改。
这是一个示例
$ cat a.txt
abc
text 1 2
2 3 4
ab end
hello
here
$ perl -pe 's/text.*end/textChanged/g' a.txt # Nothing happens - while reads line by line
abc
text 1 2
2 3 4
ab end
hello
here
现在,您可以将记录分隔符变量设置为undef
.
$ perl -pe ' BEGIN { $/=undef } s/text.*end/textChanged/g' a.txt # Nothing happens
abc
text 1 2
2 3 4
ab end
hello
here
但是,当您添加 /s 修饰符时,会发生替换。
$ perl -pe ' BEGIN { $/=undef } s/text.*end/textChanged/gs ' a.txt
abc
textChanged
hello
here
$
使用 slurp 模式读取整个文件,您的替换也没有任何反应。
$ perl -0777 -pe ' s/text.*end/textChanged/g ' a.txt
abc
text 1 2
2 3 4
ab end
hello
here
$
现在您使用 /s 标志,以便 dot 也可以匹配换行符并进行替换。
$ perl -0777 -pe ' s/text.*end/textChanged/gs ' a.txt
abc
textChanged
hello
here
$
感谢@ikegami ...提供捆绑选项,如下所示
$ perl -0777pe ' s/text.*end/textChanged/gs ' a.txt
因此,当您希望点匹配换行符时,您需要在正则表达式中添加 /s 修饰符。
推荐阅读
- excel - 如何使用 VBA 变量在 VLookup 中跨多个工作簿的查找值
- r - 如何使用 ggplot barplot 绘制表函数的结果(x 轴值问题)
- redundancy - 您能否在现有的 Apache Geode 区域上增加复制?
- sql-server - 在“)”附近预期条件的上下文中指定的非布尔类型的表达式
- r - 如何使用 r 中的 lavaan 包获取 CFA 中因子的相关矩阵和 p 值?
- javascript - res.redirect 错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头
- python-3.x - 在linux系统上构建python包后如何访问资源文件
- sas - 网格单元的 SAS 点计数
- vue.js - 如果我的变量是数组,如何更改 vuex 中的状态
- android - Firebase 身份验证返回按钮