perl 命令行上的多个正则表达式无法按预期工作

Multiple regexps on perl command-line doesn't work as expected

我在 perl 命令行中使用了两个正则表达式,但没有给出预期的结果:

$ cat test
foo
bar
#baz
#haz
naz
$ perl -pe 's/\n/\n/g; s/\n#.*$/CHEESE/' test
foo\nbar\n#baz\n#haz\nnaz\n\n

我希望结果是 foo\nbarCHEESE。我做错了什么?

问题是您的输入文件一次读取一行;每行输入执行一次代码。因为换行符位于每行的 end 处,所以第二个正则表达式模式 \n#.*$ 永远无法匹配

解决方案是启用 slurp 模式,在一次读取中获取整个文件。那么你的替换只会发生一次。 -0777 的开关值将为您执行此操作

$ perl -0777 -pe 's/\n/\n/g; s/\n#.*$/CHEESE/' test

输出

foo\nbarCHEESE