我纯粹在bash/tmux中设置了一个regex学习环境,其中有一个包含regex的文件窗格、一个用于处理文本文件的窗格和一个用于bash shell的窗格。我在“The Bastards Book of Ruby”的开头-regex章节。
“bastart's book”展示了一个“negative lookahead”regex(perfect,let learn)的示例,其中建议使用perl而不是sed。当我使用cli方法时->bash命令:$ perl -p file_with_regex.pl test.txt
(这将打印test.txt中包含预期替换的行)
问题:如何在regex.pl文件中添加第二个regex(在新行),并让perl执行第一条和第二条(下一条)指令来处理文本文件?
# regex.pl
s/^(?!Mr)/Ms./g
s/Ms./Mrs./g
(添加第二个regex会导致“由于编译错误而中止regex.pl的执行。”)
这里的总体目标是在ruby中取得进展,同时尽可能简洁地测试正则表达式。在这样做的时候,只需要最少的sed/perl就可以了,因为对perl的适当深入研究需要ruby的时间(当perl深入研究的时候,我将有一些时间了解基本知识)。我看得越多,就越有必要用ruby来实现它,如果没有一个perl开关可以启用命令行加文件的方法。
最佳答案
基本的答案是每行后面都需要一个分号。
根据perlrun,-p
读取所有输入行,运行指定的命令,然后打印出$_
中的值(此脚本中运行替代命令的隐式变量)。
所以,去掉这个魔法,你的代码就变成了:
LINE:
while (<>) {
# regex.pl
s/^(?!Mr)/Ms./g
s/Ms./Mrs./g
} continue {
print or die "-p destination: $!\n";
}
Perl在语句之间需要分号(但块末尾的终端分号是可选的),因此出现错误。
我个人建议将上面的整个脚本编写到文件中,而不要使用
-p
,因为它远没有那么神奇,但欢迎您以任何方式执行。如果你要写整个剧本,我建议你写一些更像下面的东西:
use strict;
use warnings;
while ( my $line = <ARGV> ) {
$line =~ s/^(?!Mr)/Ms./g;
print "After first subst: $line";
$line =~ s/Ms./Mrs./g;
print "After second subst: $line";
}
-p
和use strict
是您希望在任何Perl脚本的顶部(用来捕捉输入错误和其他常见错误)的样板,并且显式调用变量use warnings
可以让您更好地理解脚本是如何工作的($line
对于初学者来说是非常神奇的,而且是许多错误的来源,但非常棒当你知道什么是什么)。如果您想知道
$_
与<>
是同一回事,意思是“通读作为命令行参数提供给此脚本的所有文件行,如果没有提供文件,则通读作为标准输入的所有文件行”。关于ruby - Sed或Perl:一个包含正则表达式指令的文件,每行一条指令,在另一文件上执行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31039102/