Substitua a string especificada por sua hora de aparecimento usando sed ou awk

1

Eu quero substituir oooo por 1, 2, 3, ..., como um exemplo abaixo:

De

> 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

para

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
    
por Ming Su 28.04.2016 / 12:06

4 respostas

3

Com python (versão 2 ou 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='')

Isso também funciona se houver mais de uma ocorrência de oooo em uma linha.

    
por 28.04.2016 / 12:21
2

Uma possível solução perl

perl -00 -F/\nendsnippet\n/ -pe '$n=1; s/oooo/$n++/ge' demo.snippet
    
por 28.04.2016 / 13:21
2

Outro perl , sem lesar todo o arquivo na memória:

perl -pe 's/oooo/++$i/ge; $i = 0 if /endsnippet/' <file
    
por 28.04.2016 / 14:36
0

Eu uso o seguinte código awk , parece funcionar muito bem.

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

edit: isso pode ser reescrito como

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

Tags