substituições Enumerar com awk ou sed
-
22-08-2019 - |
Pergunta
Dado o arquivo de texto simples com linhas
bli foo bla
abc
dfg
bli foo bla
hik
lmn
o sed ou awk transforma mágicas para
bli foo_01 bla
abc
dfg
bli foo_02 bla
hik
lmn
para que cada ocorrência de 'foo' é substituída por 'foo_ [número de ocorrência]'.
Solução
Esta é uma outra maneira de expressar a resposta de radoulov
awk '/foo/ {sub(/foo/, "&_" sprintf("%02d",++c))} 1' infile
Você deve tomar cuidado para que você não corresponder "foobar", enquanto procura "foo":
gawk '/\<foo\>/ {sub(/\<foo\>/, "&_" sprintf("%02d",++c))} 1'
Outras dicas
awk '!/foo/||sub(/foo/,"&_"++_)' infile
Use gawk , nawk ou / usr / XPG4 / bin / awk em Solaris .
Este provavelmente não é o que você precisa, mas pode dar algumas idéias na direção certa.
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:
Eu sou um dia de atraso e um centavo curta, mais uma vez, - (
EDIT2:
Codificação de caracteres é outra coisa a procura de ... Java de código fonte não é necessariamente na codificação de sistemas padrão ... é parar de codificação UTF-8, para permitir quaisquer embutidos "entidades de ordem superior" ;-) Muitos * nix utilidades ainda não estão charset-aware.