如何使用bash构建正则表达式以实现以下输出?

时间:2016-09-28 16:34:36

标签: regex bash

大家好我正在处理一些文字我有以下列表:

19599
9259
9259
9259
9259
9259
9159
9157
RTSR
RTSR
AWKJ001
AWKJ001
AWKJ001
9159

我想要的输出是:

019599
009259
009259
009259
009259
009259
009159
009157
RTSR
RTSR
AWKJ001
AWKJ001
AWKJ001
009159

我用记事本手动尝试但是列表太长了,我相信最好的方法是构建一个正则表达式,正则表达式应该查找以数字开头的思考并计算有多少字符必须然后放两个或一个0来使该数字的大小为6,例如

19599 -> 019599
9259 -> 009259

但它不应该以字母开头的行进行任何更改,例如:

AWKJ001

感谢您的支持,

3 个答案:

答案 0 :(得分:4)

awk可以轻松完成此操作:

awk '$0+0 == $0 {$0 = sprintf("%06i", $0)} 1' file

019599
009259
009259
009259
009259
009259
009159
009157
RTSR
RTSR
AWKJ001
AWKJ001
AWKJ001
009159

工作原理:

  • $0+0 == $0检查给定的行是否仅为数字
  • sprintf("%06i", $0)使用6填充
  • 使其0长度

答案 1 :(得分:1)

这是一个perl one-liner:

perl -ple 'if (/^\d/) {$_="0" x (6-length($_)) . $_}' input

输出:

019599
009259
009259
009259
009259
009259
009159
009157
RTSR
RTSR
AWKJ001
AWKJ001
AWKJ001
009159

从概念上讲,这很简单。我们检查默认变量($_)是否包含以数字开头的字符串,如果是,我们只是在它前面加上6-length($_)个零。

答案 2 :(得分:1)

一些null。首先用五个0(show_errors_inline - > sed)替换所有数字字符串的开头,然后使用反向引用将所有数字字符串替换为最后六个数字( 9259 000009259):

000