0

次のことを行うスクリプトを作成する必要がありsedます。行に 3 つの数字が含まれている場合、4 番目の数字から数字が 2 回書き込まれます。

たとえば、この入力の出力:

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

他のほとんどの 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 番目の部分を使用して、行を再配置します。
于 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 に答える