0

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

例如,此输入的输出:

abc 1 def2 3 ab4
123 zy 
ab1cd2ef3gh4z56

将会:

abc 1 def2 3 ab44 
123 zy 
ab1cd2ef3gh44z5566

我该怎么做?

4

2 回答 2

4

这可能对您有用(GNU sed):

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

另一种可能适合大多数其他 sed 的替代方法是:

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/使用原始线的第一部分和处理线的第二部分重新排列线。
于 2013-01-25T21:18:26.527 回答
0

perl这可能比使用更容易sed

$ 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";
'
于 2013-01-25T20:02:57.280 回答