我需要用零填充字符串,直到它们达到四位数的限制,例如:
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
上运行。我不知道如何忽略这些字母。
答案 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.