在sed替换中忽略数字末尾可能的非数字

时间:2017-09-27 21:59:13

标签: bash awk sed

我需要用零填充字符串,直到它们达到四位数的限制,例如:

1 -> 0001
44 -> 0044
555 -> 0555
1a -> 0001a
44b -> 0044b
565c -> 0565c
7890 -> 7890

我有一个bash脚本,我将包含这些数字的文件添加为参数。

#!/bin/bash

FILE=$1
if [ ! -f $FILE ]; then
    exit 1
fi

sed -i 's/\<[0-9]\>/0&/g' $FILE
sed -i 's/\<[0-9][0-9]\>/0&/g' $FILE
sed -i 's/\<[0-9][0-9][0-9]\>/0&/g' $FILE

该脚本无法在1a, 44b, 565c上运行。我不知道如何忽略这些字母。

4 个答案:

答案 0 :(得分:2)

GNU awk 会是一个更好的工具:

awk -i inplace 'match($1,/([0-9]*)(.*)/,arr){$1=sprintf("%04d%s",arr[1],arr[2])}1' input.txt

填补1到4位数。

测试:

$ cat input.txt
1
44
555
1a
44b
565c
7890

awk 'match($1,/([0-9]*)(.*)/,arr){$1=sprintf("%04d%s",arr[1],arr[2])}1' input.txt
0001
0044
0555
0001a
0044b
0565c
7890

假设数据的排序方式与@ xhienne的答案相同,那么我们就会遍历字段:

$ cat input.txt
1 44 555 1a 44b 565c 7890 77777

$ cat tst.awk
{ for (i=1;i<=NF;i++)
    if (match($i,/([0-9]*)(.*)/,arr))
      $i=sprintf("%04d%s",arr[1],arr[2])
}1

$ awk -f tst.awk input.txt
0001 0044 0555 0001a 0044b 0565c 7890 77777

答案 1 :(得分:1)

使用000为每个数字序列添加前缀,然后将结果截断为最后四位数字:

sed -i '
    s/[0-9]\{1,\}/000&/g
    s/0*\([0-9]\{4\}\)/\1/g
' "$FILE"

或者使用GNU sed

sed -i -r '
    s/[0-9]+/000&/g
    s/0*([0-9]{4})/\1/g
' "$FILE"

示例:

Sample line : 1 44 555 1a 44b 565c 7890 77777

收率:

Sample line : 0001 0044 0555 0001a 0044b 0565c 7890 77777

答案 2 :(得分:0)

要匹配零个或多个字符,我们可以使用*并匹配我们可以使用的任何非数字[^0-9]

因此,在数字匹配之后以及匹配字符串其余部分的模式之前,请将正则表达式调整为包含[^0-9]*,以便匹配这些字母。

答案 3 :(得分:0)

请你再试一下awk的方法,如果有人帮助你,请告诉我。

awk '{val=$0;gsub(/[0-9]+/,"",val);printf("%04d%s\n",$0,val)}'  Input_file

输出如下。

0001
0044
0555
0001a
0044b
0565c
7890

说明:此处还添加了非单一形式的解决方案,并附有说明。

awk '{
val=$0;                   ##Storing current line into a variable named val here.
gsub(/[0-9]+/,"",val);    ##Globally substituting all digits with NULL in variable val now, to make sure we are getting everything apart from digits.
printf("%04d%s\n",$0,val);##Now using printf of awk, whose quality is it will automatically take till all digits and do padding with zeros if needed till to make it 4 digit number that is why %04d is being used then I am using %s to print string with respect to the value of val, where we stored all values of strings previously.
}
' Input_file             ##Mentioning Input_file name here.