我正在尝试使用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)。
答案 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
通过这种方式,您可以通过将结果发送到终端来检查结果,然后在确定结果正确时将其写入文件。