使用正则表达式删除小数点

时间:2012-08-14 18:44:07

标签: regex bash unix sed awk

我有大约5,000个文件,我需要纠正错误。每个文件都有一个类似于:

的部分
<rating system="nl-movies">16.0</rating>
<rating system="ro-movies">8.0</rating>

<rating *something*>A.0</rating>

我需要从每个中移除.0,以便文字看起来像:

<rating system="nl-movies">16</rating>
<rating system="ro-movies">8</rating>

<rating *something*>A</rating>

换句话说,我需要将.0</rating>替换为</rating>。我如何在unix中执行此操作并在文件夹结构中递归更改?

感谢所有帮助:这就是最终的工作:

find ./ -type f -name '*.xml' -exec sed -i 's/\.0<\/rating>/<\/rating>/g' {} \;

3 个答案:

答案 0 :(得分:1)

替换所有尾随小数

如果要替换所有尾随小数,而不仅仅是以.0结尾的小数,则可以使用此表达式。

sed 's/\.[[:digit:]]\+</</' /tmp/foo

替换Just .0

如果你想删除.0,而不是其他小数,那么你可以更具体。例如:

sed 's/\.0</</' /tmp/foo

在这种情况下,它将从8.0中删除小数,但不会删除8.1。如果你想处理像“B.6”这样的情况,你可能需要做一些额外的调整。

答案 1 :(得分:0)

以下内容应该为您做到这一点

find /some/path -type f | xargs sed -i 's/\.0\(<\/rating>\)/\1/g'

/some/path替换为您要开始替换的基本目录的路径,如果所有文件都具有-name *.xml命令,您可能还需要将find添加到{{1}}命令中相同的后缀。

答案 2 :(得分:0)

单个文件的安全解决方案是:

sed -ri 's/(<rating[^>]*>[^.<]+)\.0(<\/rating>)/\1\2/g' file.txt

以及目录/path中的多个文件:

find /path -name *.txt | xargs sed -ri 's/(<rating[^>]*>[^.<]+)\.0(<\/rating>)/\1\2/g'