我得到了一些在第一个字段中包含数字的行:
46066.874.89
48569.123.56
56489.256.88
654.12.32
84689.25.69
我现在想做的是00
在第四行的末尾添加654
,并且在第一个 之前的文件中每隔三个数字出现一次.
。我该怎么办呢?我尝试使用
sed 's/^[0-9][0-9][0-9]./&00/'
但我得到的输出是
4606006.874.89
4856009.123.56
5648009.256.88
654.0012.32
8468009.25.69
答案1
你快到了:
$ sed -E 's/^([0-9][0-9][0-9])\./\100./' file
46066.874.89
48569.123.56
56489.256.88
65400.12.32
84689.25.69
答案2
您的sed
命令在三位数字后插入两个零,并在每行开头插入另一个字符。匹配.
“任何字符”。即使您已经转义了点以\.
匹配实际的点,您也会插入两个零后点。
稍微调整一下就可以了:
$ sed 's/^\([0-9]\{3\}\)\./\100./' file
46066.874.89
48569.123.56
56489.256.88
65400.12.32
84689.25.69
或者,如果您sed
支持扩展正则表达式(现在大多数都支持):
$ sed -E 's/^([0-9]{3})\./\100./' file
46066.874.89
48569.123.56
56489.256.88
65400.12.32
84689.25.69
使用awk
并使其更加通用:
$ awk -F . 'BEGIN { OFS=FS } length($1) < 5 { $1 = sprintf("%s%.*d", $1, 5 - length($1), 0) }; 1' file
46066.874.89
48569.123.56
56489.256.88
65400.12.32
84689.25.69
awk
对于第一个点分隔列中长度小于五个字符的每个条目,此命令将使用必要数量的零填充字符串,以便字符串的总长度变为五个字符。
这是通过将整数格式化0
为缺失长度的零填充字符串来完成的。然后将其与该字段中的现有数据连接起来。
这适用于第一个字段中的任何短字符串(不仅仅是包含三个字符的字符串)。
在字符串开头填充零更容易(但不是所要求的,理所当然):
$ awk -F . 'BEGIN { OFS=FS } { $1 = sprintf("%.5d", $1) }; 1' file
46066.874.89
48569.123.56
56489.256.88
00654.12.32
84689.25.69
我们只是利用第一个字段包含一个整数的事实,并将其格式化为sprintf()
正确宽度的零填充整数。
在这两个命令中,1
末尾的 都会调用默认操作,即打印当前行(可以用{ print }
或替换{ print $0 }
)。