Substitua apenas alguns números usando sed [closed]

0

Eu tenho que substituir 1 com one , two com 2 e assim por diante, mas 11, por exemplo, tem que permanecer inalterado. Usando

sed -i 's/1/one/g' 

nome do arquivo também muda 11.

Eu não sei como verificar linha por linha e só mudo o que preciso. Existe alguma outra maneira?

    
por Darius 03.05.2017 / 20:02

1 resposta

1

Você pode fazer isso com perl :

perl -lpe 's/(?<!\d)1(?!\d)/one/g' test.txt

Explicação:

  • perl linguagem de script que se destaca no processamento de texto
  • -l lidam de maneira sensata com os términos de linha
  • p imprime automaticamente cada linha
  • e executa o seguinte comando
  • ' início das instruções
  • s/ substituto
  • (?<!\d) lookbehind negativo: a correspondência não deve seguir um dígito
  • 1 literal 1
  • (?<!\d) lookahead negativo: a correspondência não deve ser seguida por um dígito
  • /one substitui com literal one
  • /g substitui todas as correspondências
  • ' end of instructions

Teste:

perl -lpe 's/(?<!\d)1(?!\d)/one/g' test.txt > test1.txt
head test*.txt
==> test.txt <==
1
11
111
a1
1a
1a1

==> test1.txt <==
one
11
111
aone
onea
oneaone

Atualização: para alterar automaticamente 1-9 com one-nine você pode

  1. escreva todas as substituições

    perl -lpe 's/(?<!\d)1(?!\d)/one/g;s/(?<!\d)2(?!\d)/two/g;s/(?<!\d)3(?!\d)/three/g;s/(?<!\d)4(?!\d)/four/g;s/(?<!\d)5(?!\d)/five/g;s/(?<!\d)6(?!\d)/six/g;s/(?<!\d)7(?!\d)/seven/g;s/(?<!\d)8(?!\d)/eight/g;s/(?<!\d)9(?!\d)/nine/g;' test.txt
    
  2. use um perl array

    perl -lpe '@a=qw(zero one two three four five six seven eight nine);s/(?<!\d)(\d)(?!\d)/$a[$1]/g' test.txt
    
  3. faça um loop sobre o one-liner com bash

    NUMBERS=(zero one two three four five six seven eight nine)
    for i in "${!NUMBERS[@]}"; do
        perl -i -lpe 's/(?<!\d)'$i'(?!\d)/'${NUMBERS[$i]}'/g' test.txt
    done
    
por simlev 10.08.2017 / 16:32