次のことを行うスクリプトを作成する必要がありsed
ます。行に 3 つの数字が含まれている場合、4 番目の数字から数字が 2 回書き込まれます。
たとえば、この入力の出力:
abc 1 def2 3 ab4
123 zy
ab1cd2ef3gh4z56
になります:
abc 1 def2 3 ab44
123 zy
ab1cd2ef3gh44z5566
どうすればいいですか?
これはうまくいくかもしれません(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) のすべての数値を 2 倍にするG
改行と HS を PS に追加するs/.*\n\(.*\)\n\(.*\)\n.*/\2\1/
元の行の最初の部分と処理された行の 2 番目の部分を使用して、行を再配置します。これは、次の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";
'