【问题标题】:change last two digits of a number using sed使用 sed 更改数字的最后两位数字
【发布时间】:2011-03-15 09:43:53
【问题描述】:

我使用这个命令:

sed 's/;\([0-9]*\),\([0-9]*\);/;\1.\2;/g;s/;\(\r\?\)$/\1/' inputfile

根据我的需要更改巨大的 csv 文件(请参阅 delete ';' at the end of each line)。

现在碰巧在某些 csv 文件中存在像 20000500 这样的“虚构日期”,由于最后两个零(日期不可能)而无法导入 SQL。

在这种情况下,我如何编辑我的 sed 命令以始终将最后两位数字更改为 01(我的意思是仅当它们为 00 时)?

我试过了

sed 's/;\([0-9]*\),\([0-9]*\);/;\1.\2;/g;s/;\([0-9]{6}\)00;/;\101;/g;s/;\(\r\?\)$/\1/' inputfile

但这不起作用。

【问题讨论】:

    标签: regex linux date sed


    【解决方案1】:

    我认为{6} 是一个扩展的正则表达式。所以你要么必须使用sed -r,要么将你的正则表达式更改为s/;\([0-9][0-9][0-9][0-9][0-9][0-9]\)00;/;\101;/g

    如果您想使用扩展正则表达式,请执行以下操作:

    sed -r 's/;([0-9]{6})00;/;\101;/g'
    

    即:您必须从括号中删除反斜杠。

    编辑:关于丹尼斯威廉姆森的评论,也可以通过转义花括号来使用常规正则表达式:

    sed 's/;\([0-9]\{6\}\)00;/;\101;/g'
    

    【讨论】:

    • 或者,您可以避开花括号。
    • 谢谢丹尼斯,这是一个很好的观点。我也会将此添加到我的答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2012-02-22
    相关资源
    最近更新 更多