我需要编写一个sed
脚本来执行以下操作:
如果一行包含3个数字,那么从第4个数字开始,该数字将被写入两次。
例如,此输入的输出:
abc 1 def2 3 ab4
123 zy
ab1cd2ef3gh4z56
将是:
abc 1 def2 3 ab44
123 zy
ab1cd2ef3gh44z5566
我该怎么做?
答案 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)
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";
'