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이는 한 줄에서 여러 번 발생하는 경우에도 작동합니다.

답변2

가능한 Perl 솔루션

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

답변3

perl메모리의 전체 파일을 차지하지 않는 또 다른 하나는 다음과 같습니다 .

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

관련 정보