如何在国际象棋PGN数据库中为每步白方着法添加"$18"?
解决方案
要实现给PGN国际象棋数据库中每步白方着法后添加$18的需求,你可以用这条Perl命令,和你之前处理胜负标记的思路一脉相承:
perl -00 -ne 's/(\d+\.\s+\S+)/$1 \$18/g; print;' games.pgn>white_moves_with_tag.pgn
命令细节拆解:
-00:开启段落模式,把PGN里的整个对局作为一个独立处理单元,避免因为对局换行导致的匹配遗漏——毕竟PGN经常会把长对局拆分成多行显示。-ne:n让Perl循环处理输入的每个段落,e允许直接在命令行写处理脚本,不用单独创建Perl文件。- 正则表达式
(\d+\.\s+\S+):精准捕获白方着法的核心结构:\d+:匹配着法的数字序号(比如1、2)\.:匹配序号后的小数点(必须转义,因为.在正则里是通配符)\s+:匹配序号和着法之间的空白(空格、制表符都能覆盖)\S+:匹配白方的着法内容(比如e4、Nf3这类非空白的棋步字符)
- 替换规则
$1 \$18:$1代表刚才捕获的完整白方着法,后面加上空格和$18——这里的\$是转义处理,防止Perl把$18误判为变量引用。 - 最后的
games.pgn>white_moves_with_tag.pgn:指定输入的PGN源文件,把处理后的结果输出到新文件中,避免直接覆盖原数据。
兼容复杂场景的拓展版本:
如果你的PGN里有更复杂的着法(比如带吃子符号x、将军+、将死#,或者带简单注释的情况),可以把正则里的\S+换成[\w#x+]+,这样能兼容更多棋步格式,命令调整为:
perl -00 -ne 's/(\d+\.\s+[\w#x+]+)/$1 \$18/g; print;' games.pgn>white_moves_with_tag.pgn
内容的提问来源于stack exchange,提问作者darmar
相关产品推荐
相关产品推荐

