为匹配的正则表达式添加后缀

为匹配的正则表达式添加后缀

我得到了一些在第一个字段中包含数字的行:

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 })。

相关内容