Substitua instâncias de palavras por sua contagem anexada a ele

1

Eu tenho um arquivo que contém a palavra 'name' várias vezes (250 vezes).

Eu preciso substituir cada instância de 'name' por sua contagem anexada a ele como name_1, name_2, name_3 .... name_250.

Posso fazer isso usando sed?

Quais sinalizadores eu preciso usar?

    
por narendra-choudhary 16.09.2014 / 07:42

3 respostas

5

Um trabalho para perl :

perl -pe 's/\bname\b\K/"_".++$n/ge'
    
por 16.09.2014 / 08:24
1

Como isso envolve aritmética, isso não é um bom problema para sed . No entanto, awk pode lidar com isso:

awk '{for (i=1;i<=NF;i++) { if ($i=="name") {c++;$i=$i"_"c} }} 1'

Por exemplo:

$ echo  a name b name name c d name | awk '{for (i=1;i<=NF;i++) { if ($i=="name") {c++;$i=$i"_"c} }} 1'
a name_1 b name_2 name_3 c d name_4

Explicação:

  • {for (i=1;i<=NF;i++) { if ($i=="name") {c++;$i=$i"_"c} }}

    Esse loop for itera sobre cada palavra encontrada na entrada. Se a palavra for name , a variável do contador c será incrementada e seu valor será anexado à palavra.

  • 1

    Na linguagem awk , essa abreviação oculta significa imprimir toda a linha.

Como efeito colateral, o espaço branco estranho será removido. Isso inclui espaços em branco à esquerda e à direita em cada linha e espaços entre palavras são reduzidos a um único espaço em branco.

    
por 16.09.2014 / 08:10
0

No script simples de bash

#!/bin/bash
count=0
search="linux"

while read line
do
      for word in ${line}
      do
           if [[ $word == $search ]]
           then
                printf "${word}_${count} "
                ((count++))
           else 
                printf "$word "
           fi
      done
      echo 
done < input_file
    
por 16.09.2014 / 08:12