使用sed更改数字的最后两位数字

spe*_*ndo 5 regex linux date sed

我用这个命令:

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

根据我的需要更改巨大的csv文件(请参阅每行末尾的删除';').

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

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

我试过了

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

但这不起作用.

bmk*_*bmk 6

我认为{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'
Run Code Online (Sandbox Code Playgroud)

即:你必须从parens中删除反斜杠.

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

sed 's/;\([0-9]\{6\}\)00;/;\101;/g'
Run Code Online (Sandbox Code Playgroud)

  • 或者,你可以逃避花括号. (3认同)
  • 谢谢丹尼斯,这是一个好点.我还要将此添加到我的答案中. (2认同)