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

时间:2014-02-15 18:16:00

标签: regex perl command-line

我有一个包含国际象棋动作的文件 -

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)替换它?

3 个答案:

答案 0 :(得分:1)

这应该这样做:

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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