我需要编写一个sed
脚本来执行以下操作:如果一行包含 3 个数字,那么从第 4 个数字开始,该数字将被写入两次。
例如,此输入的输出:
abc 1 def2 3 ab4
123 zy
ab1cd2ef3gh4z56
将会:
abc 1 def2 3 ab44
123 zy
ab1cd2ef3gh44z5566
我该怎么做?
这可能对您有用(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 添加到 PSs/.*\n\(.*\)\n\(.*\)\n.*/\2\1/
使用原始线的第一部分和处理线的第二部分重新排列线。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";
'