Usando 'sed', desejo substituir qualquer sequência de 10 dígitos por 1234567890
Isso funciona, mas não é muito elegante
echo "code=1111111111" | sed 's/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/1234567890/'
Isso não funciona
echo "code=1111111111" | sed 's/[0-9]{10}/1234567890/'
resultado
code=1111111111
Alguém pode sugerir uma solução simples e elegante que usa 'sed'?
sed
usa expressão regular básica por padrão, o que significa que{10}
será tratado como texto simples.Você pode verificar isso:
Qual será a saída:
No seu caso, você precisa:
-E
opção para especificar que deseja usar Expressões Regulares Estendidas.{
e}
assim:\{10\}
.Usando
ERE
sabor regex:Outros já apontaram que você está tentando usar uma expressão regular estendida POSIX com
sed
, que por padrão entende expressões regulares básicas POSIX . Algumas (a maioria) implementações da ferramenta entendem expressões regulares estendidas se você usar a-E
opção, mas também pode alterar a expressão para uma básica alterando{10}
para\{10\}
.No entanto, se você quiser ter certeza de substituir o número correto de dez dígitos, provavelmente deve evitar combinar números mais longos e aqueles que ocorrem em outros lugares na entrada.
Sem saber mais sobre a entrada, eu restringiria a correspondência combinando o
=
caractere e o final da linha:Isso evita a correspondência de números mais longos e números de dez dígitos que não ocorrem entre a
=
e o final da linha.Se você sabe que precisa alterar o valor da
code
variável (ou o que quer quecode
seja), também corresponda a esse nome (aqui, também estou assumindo que o nome começa no início da linha e estou capturando o nome e substituindo-o com\1
na substituição para reduzir a duplicação):Se você deseja substituir a primeira sequência de 10 e não mais dígitos decimais ASCII por 1234567890 em cada linha, provavelmente deve ser:
Ou seja, substitua apenas 10 dígitos (usando
[0123456789]
em vez de[0-9]
como o último pode corresponder a muito mais caracteres do que apenas 0123456789, dependendo dased
implementação e/ou localidade) precedido pelo início da linha ou um não dígito e seguido por um não -digit ou o fim da linha.Isso ainda substituiria
1112223334.6
com1234567890.6
ou1.0000000000e-2
com1.1234567890e-2
ou então você pode precisar se adaptar dependendo do que deseja e do que pode encontrar na entrada0xff0777888999ee
.0xff1234567890ee
Para substituir todas as sequências de 10 e não mais dígitos, isso poderia ser:
Ou você pode mudar para
perl
:Usando os operadores negativos de verificação para verificar se a sequência de 10 dígitos decimais não é precedida nem seguida por outro dígito.
Obrigado @Kamil Maciorowski
Isso funciona bem