2009-05-19 12 views
2

Compte tenu du fichier texte avec des lignesénumèrent substitutions avec sed ou awk

bli foo bla 
abc 
dfg 
bli foo bla 
hik 
lmn 

ce sed ou la magie awk, il se transforme en

bli foo_01 bla 
abc 
dfg 
bli foo_02 bla 
hik 
lmn 

de sorte que chaque occurence de 'foo' est remplacé par ' foo_ [numéro de occurence] '.

+0

Michael, plus explication de les exigences, et en particulier le format d'entrée, sont nécessaires pour que quiconque tente de répondre à cette question de manière significative ... Je suppose que vous avez simulé ce qui est censé être un échantillon simplifié mais représentatif d'un fichier du monde réel ... ce fichier? un fichier journal? un fichier journal mysql? Juste une supposition. À votre santé. Keith – corlettk

+0

en fait c'est un fichier source java et la transformation est utilisée pour rendre les noms de méthodes uniques –

+0

Salut les gars, merci pour les solutions, j'ai modifié la question un peu, ajouter du bruit autour du foo –

Répondre

0

C'est une autre façon d'exprimer la réponse de radoulov

awk '/foo/ {sub(/foo/, "&_" sprintf("%02d",++c))} 1' infile 

Vous devez prendre soin que vous ne correspondent pas « foobar » en cherchant « foo »:

gawk '/\<foo\>/ {sub(/\<foo\>/, "&_" sprintf("%02d",++c))} 1' 
1

Ce n'est probablement pas ce dont vous avez besoin, mais cela pourrait donner quelques idées dans la bonne direction.

[email protected] ~ 
$ cd c:/tmp 

[email protected] /cygdrive/c/tmp 
$ cat <<-eof >foo.txt 
> foo 
> abc 
> dfg 
> foo 
> hik 
> lmn 
> eof 

[email protected] /cygdrive/c/tmp 
$ awk '/^foo$/{++fooCount; print($0 "_" fooCount);} /^ /{print}' foo.txt 
foo_1 
abc 
dfg 
foo_2 
hik 
lmn 

EDIT:

Je suis un jour de retard et un sou court, encore une fois ;-(


EDIT2:

encodages de caractères est une autre chose à surveiller ... Java s Le code ource n'est pas forcément dans l'encodage par défaut du système ... il est encodé en UTF-8, pour permettre toutes les "entités d'ordre supérieur" ;-) Beaucoup d'utilitaires * nix ne sont toujours pas sensibles au charset.

2
awk '!/foo/||sub(/foo/,"&_"++_)' infile 

Utilisez gawk, nawk ou /usr/xpg4/bin/awk sur Solaris.