sed脚本有条件地复制数字

时间:2013-01-25 19:27:34

标签: unix sed

我需要编写一个sed脚本来执行以下操作: 如果一行包含3个数字,那么从第4个数字开始,该数字将被写入两次。

例如,此输入的输出:

abc 1 def2 3 ab4
123 zy 
ab1cd2ef3gh4z56

将是:

abc 1 def2 3 ab44 
123 zy 
ab1cd2ef3gh44z5566

我该怎么做?

2 个答案:

答案 0 :(得分:4)

这可能适合你(GNU sed):

sed 's/[0-9]/&&/4g' file

可能适合大多数其他seds的替代方案是:

sed '/\(\([0-9][^0-9]*\)\{3\}\)\([0-9]\)/{s//\1\n\3/;h;s/[0-9]/&&/g;G;s/.*\n\(.*\)\n\(.*\)\n.*/\2\1/}' file
  • /\(\([0-9][^0-9]*\)\{3\}\)\([0-9]\)/如果该行包含4个或更多数字
  • s//\1\n\3/标记第4个数字以换行符开头的位置
  • h将标记的行复制到保留空间(HS)
  • s/[0-9]/&&/g加倍模式空间(PS)中的所有数字
  • G将新行和HS附加到PS
  • s/.*\n\(.*\)\n\(.*\)\n.*/\2\1/使用原始行的第一部分和处理行的第二部分重新排列行。

答案 1 :(得分:0)

perlsed

更容易
$ cat /tmp/test
abc 1 def2 3 ab4
123 zy 
ab1cd2ef3gh4z56

$ perl -n < /tmp/test -e '
$count = 0;
while (/([^\d]*)(\d)/gi) {
  print $1, (++$count > 3 ? "$2$2" : $2), $3
}
print "\n";
'