如何转换文本文件中的所有数字

时间:2013-03-30 14:27:56

标签: bash text command-line

我有一个XML文件,其中包含数字。类似的东西:

<things>
    <a name="cat">
        <vecs>(100,20),(200,40),(50,85)</vecs>
    </a>
    <b name="dog">
        <vecs>(0,10),(5,75)</vecs>
        <ratio>85.5</ratio>
    </b>
    ... many more elements and numbers ...
</things>

不幸的是,我文件中包含<vecs>元素的所有数字都比它们应该大4倍。我需要将它们乘以0.25。 <ratio>中的数字和其他元素都可以。例如,上方的第一行<vecs>应该读取:

<vecs>(25,5),(50,10),(12.5,21.25)</vecs>

是否有方便的解决方案(例如UNIX命令行工具,bash脚本等)来处理文件,以便我可以找到特定上下文中的所有数字(例如<vecs>和{{之间1}}),对它们执行数学运算,并用运算结果替换每个实例中的现有数字文本?

不,我不是要求你写一整个程序来详细解决这个特殊问题。我想知道是否有用于此类目的的现有工具或可以完成工作的现有工具的巧妙组合。

1 个答案:

答案 0 :(得分:1)

问题本身相当容易,但语法不常见,必须使用通用脚本语言来解决问题。例如,在Python中你会写这样的东西

from __future__ import print_function
import re

def transform(match):
 return '(%.2f,%.2f)' % (int(match.group(1))*0.25,
                         int(match.group(2))*0.25)

for line in file('test.xml'):
    if '<vecs>' in line:
        print(re.sub(r'\((\d+),(\d+)\)',transform,line),end='')
    else:
        print(line,end='')

对于特殊问题,最好的办法是学习一种脚本语言并用它来解决它们。

如果您想使用unix工具来做这种事情,那么sed和awk就是你的朋友。