在与前半部分匹配时更改一条线的一部分,并在两个子串之间留出空格(正则表达式)

时间:2015-02-05 18:08:32

标签: regex perl

我正在尝试使用Perl中的正则表达式检查来更改一个学生的所有成绩。 文件(grades.txt)的格式如下:

Student One - Individual Project - MF
Student Two - OOP2 - B
Student One - Other Module - C
Student Two - Other Module - F
Student One - Final Module - A+

我到目前为止cat grades.txt | perl -ne 's/(w{1,2})\+?(?!.)/A/g; print; 这会将所有成绩更改为As,但我只想将Student One的成绩更改为As。 我也尝试将正则表达式更改为(<?="Student One")\K(w{1,2})\+?(?!.),但之后并没有匹配任何内容,我感觉这与“#1;学生一”之间存在其他字符这一事实有关。和等级。

我还希望将新的更改结果输出到新文件(例如Agrades.txt)。

1 个答案:

答案 0 :(得分:1)

当您想要将文件的内容传递给Perl程序时,最好避免使用cat。如果您指定文件列表作为参数,那么Perl将全部读取它们。

此解决方案使用perl的-p开关,该开关在打印输出文件之前为输入文件中的每一行执行-e的内容。我还使用了/x正则表达式修饰符,它允许您添加无关紧要的空格,以便可以更清晰地布局图案。

替换与您自己的替换非常相似,但后跟一个if语句修饰符,可确保更改仅在以Student One开头的行上发生。 \b匹配字边界,以确保学生的姓名以One结尾,而不是Student Onedin

perl -pe"s/ [A-Z]+ \+? $ /A/x if /^Student One\b/" grades.txt

您可以在Perl程序中打开输出文件,但使用>重定向输出通常更简单,就像这样

perl -pe"s/ [A-Z]+ \+? $ /A/x if /^Student One\b/" grades.txt > Agrades.txt

通过这种方式,您可以通过将结果发送到终端来检查结果,然后在确定结果正确时将其写入文件。