查找正则表达式并将其替换为备用格式

时间:2020-01-12 05:43:04

标签: regex sed grep find

我有一个文件,其中的行包含这样的文本

something,12:3456789,somethingelse
foobar,12:345678,somethingdifferent

对于行中第二个项目在:之后有6位数字的行,我想通过在前面添加0并移动:来改变其格式。例如,上面的内容将更改为:

something,12:3456789,somethingelse
foobar,01:2345678,somethingdifferent

我不知道如何使用sed或任何unix命令行工具执行此操作

1 个答案:

答案 0 :(得分:1)

您只需要匹配中间的部分,该部分有2位数字,后跟:,后跟精确地 6位数字。如果您将文本适当地捕获到各个组中,则可以在结果中移动它们。请注意,模式结尾处的\b字边界是为了确保我们精确匹配6位数字,而不匹配包含7位数字的行:

/\b(\d)(\d):(\d{6})\b/0\1:\2\3/
 |__________________| |______|
       pattern       replacement

这给出了预期的输出。您可以在线here

进行实验

sed没有Perl样式说明符,例如\d。相反,您将需要使用[[:digit:]]。这是与sed

一起使用的更新后的正则表达式
sed -E 's/\b([[:digit:]])([[:digit:]]):([[:digit:]]{6})\b/0\1:\2\3/g' myfile.txt

正如@Jonathan Leffler指出的那样,\b在Mac的sed上不起作用,因此您需要在正则表达式模式的前后添加逗号,然后将其替换为替换模式