SED命令删除单词中的最后一位数字并替换为序列

时间:2015-07-10 15:19:41

标签: regex awk sed

我有一个类似的模式......有人可以帮助我弄明白吗

abc1 17898 8779 
abc1 68579 7879
abc2 78794 8989
abc2 97857 9897
abc3 79850 9905
.
.
.
abc120  84889 9897
abc121  87898 7879
abc121  87898 7879
abc121  87898 7879
abc122  87898 7879
abc122  87898 7879

我想删除abc旁边的数字并给它们一个正确的序列,

应该是这样的

abc1 17898 8779 
abc2 68579 7879
abc3 78794 8989
abc4 97857 9897
abc5 79850 9905
..
.
.
abc120  84889 9897
abc121  87898 7879
abc122  87898 7879
abc123  87898 7879
abc124  87898 7879
abc125  87898 7879

3 个答案:

答案 0 :(得分:1)

awksed

更容易
awk -F 'abc' '{sub(/^[0-9]+/, "", $2); print FS NR $2}' file
abc1 17898 8779
abc2 68579 7879
abc3 78794 8989
abc4 97857 9897
abc5 79850 9905
...
...

答案 1 :(得分:1)

$ awk '{sub(/[0-9]+/,NR)}1' file
abc1 17898 8779
abc2 68579 7879
abc3 78794 8989
abc4 97857 9897
abc5 79850 9905

答案 2 :(得分:0)

考虑使用支持基本算术的perl(而不是sed)。例如:

perl -pe 's/\B\d*\b/$./' filename

此处\b匹配单词边界,而\B匹配不是单词边界的空字符串,因此\B\d*\b匹配末尾的数字组(或空字符串)该行中的第一个单词,$.是当前行号 - Perl已帮助我们跟踪它。

可替换地,

perl -pe 's/^abc\d*/abc$./' filename

更符合您之前的尝试。

如果输入中的行与abc模式不匹配且不应为其增加计数器,

perl -pe 's/^abc\d*/"abc" . ++$n/e' filename

允许您自己进行计数。