使用 Perl 单行从文件中的所有数字中减去一个常量



我有一个文件,其中包含这样的国际象棋移动-

45. Qxf7+ Kh8 46. Qf8+ (46. Qf6+ Kh7 47. c6 (47. Kh2 Qe8 48. Qf4 Qd7
) 47... Bb5+ 48. Kh2 Qe8 49. c7 Bc6 50. Qd8 (50. Kg3 Bb7 51. Qd6 Qe4 52. Qd7+
Kh6 53. Qd2+ Kg7 54. f3 Qe5+ 55. Kf2 Qc5+ 56. Qe3 Qb4)) 46... Kh7 47. Qf4 Bb5+
(47... Bc4+ 48. Kh2 Bd5 49. c6 Bxc6 50. Qc7+ Kh6...

与其从 45 开始编号移动,我希望它们从 1 开始编号,就像这样 -

 1. Qxf7+ Kh8 2. Qf8+ (2. Qf6+ Kh7 3. c6 ...

问题是,我不能简单地从文件中的所有数字中减去 44,因为移动本身包含数字,如 Kh8、Bc6 等。我可以使用模式[0-9]+.检测移动编号,但是如何用(number - 44)替换它?

这应该可以做到:

perl -pe 's/(d+).s/($1-44).". "/ge' file.txt

或者使用 b 来确保数字前面没有字母

perl -p -e's/b(d+)/$1-44/ge'

然后,您无需将.和空格带入替换表达式

对已接受解决方案的改进:

perl -pe's/(d+)(?=.s)/$1-44/ge'

用法:

perl -i~ -pe'...' file.txt            Change in place with backup
perl -i -pe'...' file.txt             Change in place without backup
perl -pe'...' file.in >file.out       Read from file
perl -pe'...' <file.in >file.out      Read from STDIN

最新更新