Énumérer substitutions avec sed ou awk
-
22-08-2019 - |
Question
Étant donné le fichier texte avec des lignes
bli foo bla
abc
dfg
bli foo bla
hik
lmn
ce qu'il sed ou la magie awk se transforme en
bli foo_01 bla
abc
dfg
bli foo_02 bla
hik
lmn
pour que chaque occurence de 'foo' est remplacé par '[numéro de occurence] foo_'.
La solution
Ceci 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'
Autres conseils
awk '!/foo/||sub(/foo/,"&_"++_)' infile
Utilisez gawk , nawk ou / usr / xpg4 / bin / awk sur Solaris .
Ceci est probablement pas ce que vous avez besoin, mais il pourrait donner quelques idées dans la bonne direction.
Administrator@snadbox3 ~
$ cd c:/tmp
Administrator@snadbox3 /cygdrive/c/tmp
$ cat <<-eof >foo.txt
> foo
> abc
> dfg
> foo
> hik
> lmn
> eof
Administrator@snadbox3 /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 à ... Java recherche de code source est pas nécessairement dans l'encodage par défaut du système ... il quitte codage UTF-8, pour permettre des « entités intégrées d'ordre supérieur » ;-) Beaucoup * nix services publics ne sont toujours pas conscients charset.