Enumerar sustituciones con sed o awk
-
22-08-2019 - |
Pregunta
Dado el archivo de texto plano con líneas
bli foo bla
abc
dfg
bli foo bla
hik
lmn
lo sed o la magia awk transforma a
bli foo_01 bla
abc
dfg
bli foo_02 bla
hik
lmn
de modo que cada aparición de 'foo' se sustituye por '[número de ocurrencia] loquesea _'.
Solución
Esta es otra manera de expresar la respuesta de radoulov
awk '/foo/ {sub(/foo/, "&_" sprintf("%02d",++c))} 1' infile
Usted debe tener cuidado de que no hace coincidir "foobar", mientras que en busca de "foo":
gawk '/\<foo\>/ {sub(/\<foo\>/, "&_" sprintf("%02d",++c))} 1'
Otros consejos
awk '!/foo/||sub(/foo/,"&_"++_)' infile
Con gawk , nawk o / usr / xpg4 / bin / awk en Solaris .
Esto probablemente no es lo que necesita, pero podría darle algunas ideas en la dirección correcta.
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:
Soy un día de retraso y un penique corta, de nuevo, - (
Edit2:
Las codificaciones de caracteres es otra cosa que ... puesto de observación para el código fuente de Java no está necesariamente en la codificación predeterminada sistemas ... es dejar de codificación UTF-8, para permitir cualquier "entidades de orden superior" incrustados ;-) Muchos * nix utilidades aún no se charset-conscientes.