br comando para anexar texto diferente em múltiplas ocorrências de string

0

Eu quero usar o comando sed para acrescentar texto em várias ocorrências de string.

Por exemplo:

Hello world
types="program"
Mario
types="Game"
Hello world
types="program"
Mario
types="Game"

Então, na primeira ocorrência do Mario, eu quero acrescentar 'firstMario' e na próxima ocorrência 'secondMario', e assim por diante. OutPut:

Hello world
types="program"
firstMario
types="Game"
Hello world
types="program"
secondMario
types="Game"
    
por beginnertopython 14.08.2015 / 17:11

2 respostas

2

sed '
  /Mario/{
    s//first&/
    :1
      n
      s//second&/
    b1
  }'

Ou:

sed '
  1 {
    x;s/^/first/;x
  }
  /Mario/ {
    G
    s/\(Mario.*\)\n\(.*\)//
    x;s/second/third/;s/first/second/;x
  }'

Apesar de permitir mais de um Mario por linha e generalizar para mais substituições, eu usaria perl :

perl -pe 'BEGIN{@words=qw(first second third)}
          s/(?=Mario)/$words[$n++]/ge'
    
por 14.08.2015 / 17:23
0

Você terá dificuldade em usar "primeiro segundo terço ..." de maneira automatizada, já que eles não são descritos em nenhum lugar (pelo menos não há uma ferramenta padrão). Eu vou dar uma solução com números inteiros:

n=$( grep -c '^Mario$' file )
for (( i=1 ; i<=$n ; i++ )) ; do
  sed -i "1,/^Mario$/s/^Mario$/$i&/" file
done

saída:

Hello world
types="program"
1Mario
types="Game"
Hello world
types="program"
2Mario
types="Game"
    
por 17.08.2015 / 18:04