Substitua “o” por “0” em uma grande lista de palavras e salve a palavra original?

5

Eu tenho um arquivo de texto grande com palavras. Cada palavra está em uma única linha (lista de palavras típica).

Eu quero substituir todos os caracteres "o" pelo número "0" em cada palavra, e a nova palavra formada a ser colada na próxima linha após a palavra original.

Por exemplo, se tivermos esses dois na lista:

dog
someone

Após a manipulação, nosso arquivo deve ficar assim:

dog
d0g
someone
s0me0ne

Como isso pode ser feito com ferramentas GNU como sed ou awk ?

    
por programings 02.09.2014 / 13:00

3 respostas

11

Você pode usar sed :

sed -i -e 'p' -e 's/o/0/g' file

Explicação:

  • -i : ativa a edição no local do arquivo
  • -e 'p' : apenas cola a linha
  • -e 's/o/0/g' : substitui o por 0 e cola a linha alterada

E se você quiser uma solução awk :

awk '1;gsub("o", "0")' file >new_file
    
por 02.09.2014 / 13:05
7
A resposta do

caos é boa se todas as linhas coincidirem. Mas se algumas linhas não contiverem o , elas serão duplicadas.
Por exemplo:

$ echo -e 'foo\nbar' | sed -e 'p' -e 's/o/0/g'
foo
f00
bar
bar

Aqui estão algumas outras soluções que não duplicam linhas:

$ echo -e 'foo\nbar' | sed -e '/o/ p; s//0/g' 
foo
f00
bar

$ echo -e 'foo\nbar' | perl -pe '/o/ && print; s/o/0/g'
foo
f00
bar

$ echo -e 'foo\nbar' | awk '{ print } /o/ { gsub(/o/, "0"); print }' 
foo
f00
bar
    
por 02.09.2014 / 14:57
3

Outra solução sed :

sed -ne 'p;s/o/0/pg' file

$ printf '%s\n%s\n' 'foo' 'bar' | sed -ne 'p;s/o/0/pg'
foo
f00
bar

Explicação

  • A opção -n faz com que sed suprima a saída padrão.
  • O comando p escreve o espaço do padrão na saída padrão.
  • s/o/O/pg substitui todas as ocorrências ( g flag) de o por 0 , apenas grava espaço de padrão na saída padrão se uma substituição foi feita ( p flag).
por 02.09.2014 / 18:25