sed または awk を使用して、指定された文字列を発生時間に置き換えます。

sed または awk を使用して、指定された文字列を発生時間に置き換えます。

次の例のように、ooooを1、2、3、...に変更したいと思います。

~から

> cat demo.snippet

snippet anova.cca "anova.cca fun"
    anova.cca(
    ,${oooo:object}
    ${oooo:,...}
    ,permutations = ${oooo:how(nperm = 999)}
    ,by = ${oooo:NULL}
    )
endsnippet

snippet adonis "adonis fun"
    adonis(
    ,${oooo:formula}
    ,data = ${oooo:NULL}
    ,permutations = ${oooo:999}
    )
endsnippet

snippet anosim "anosim fun"
    anosim(
    ${oooo:,...}
    ,${oooo:grouping}
    ,permutations = ${oooo:999}
    )
endsnippet

到着

snippet anova.cca "anova.cca fun"
    anova.cca(
    ,${1:object}
    ${2:,...}
    ,permutations = ${3:how(nperm = 999)}
    ,by = ${4:NULL}
    )
endsnippet

snippet adonis "adonis fun"
    adonis(
    ,${1:formula}
    ,data = ${2:NULL}
    ,permutations = ${3:999}
    )
endsnippet

snippet anosim "anosim fun"
    anosim(
    ${1:,...}
    ,${2:grouping}
    ,permutations = ${3:999}
    )
endsnippet

答え1

Python(バージョン2または3)の使用:

from __future__ import print_function

oooo = None

with open('demo.snippet') as fp:
    for line in fp:
        if line.startswith('snippet '):
            oooo = 1
        while 'oooo' in line:
            line = line.replace('oooo', str(oooo), 1)
            oooo += 1
        print(line, end='')

ooooこれは、1行で複数回発生した場合にも機能します。

答え2

可能なPerlソリューション

perl -00 -F/\nendsnippet\n/ -pe '$n=1; s/oooo/$n++/ge' demo.snippet

答え3

perlメモリ内のファイル全体を占有しないもう1つは次のとおりです。

perl -pe 's/oooo/++$i/ge; $i = 0 if /endsnippet/' <file

答え4

以下のコードを使用しましたが、うまくawkいくようです。

awk 'BEGIN {x=0} 
     { if ($0~/oooo/) {x++; gsub(/oooo/,x); print $0} 
       else if ($0~/snippet/) {x=0; print $0} 
       else {print $0}}' demo.snippet

編集:これは次のように書き直すことができます。

awk 'BEGIN {x=0} 
     /oooo/ {x++; gsub(/oooo/,x); print $0 ; next }  
     /snippet/ {x=0;  }
     {print } ' demo.snippet

関連情報