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
literal1
-
(?<!\d)
lookahead negativo: a correspondência não deve ser seguida por um dígito -
/one
substitui com literalone
-
/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
-
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
-
use um
perl
arrayperl -lpe '@a=qw(zero one two three four five six seven eight nine);s/(?<!\d)(\d)(?!\d)/$a[$1]/g' test.txt
-
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