AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 745581
Accepted
Roger Mungo
Roger Mungo
Asked: 2023-05-11 17:49:39 +0800 CST2023-05-11 17:49:39 +0800 CST 2023-05-11 17:49:39 +0800 CST

Como substituir uma sequência de 10 dígitos usando sed

  • 772

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
  • 5 5 respostas
  • 71 Views

5 respostas

  • Voted
  1. Best Answer
    Marius_Couet
    2023-05-11T18:05:21+08:002023-05-11T18:05:21+08:00

    sedusa expressão regular básica por padrão, o que significa que {10}será tratado como texto simples.

    Você pode verificar isso:

    echo "code=1{10}" | sed 's/[0-9]{10}/1234567890/'
    

    Qual será a saída:

    1234567890
    

    No seu caso, você precisa:

    • Use a -Eopção para especificar que deseja usar Expressões Regulares Estendidas.
    • Fuja {e }assim: \{10\}.
    echo "code=1111111111" | sed -E 's/[0-9]{10}/1234567890/'
    echo "code=1111111111" | sed 's/[0-9]\{10\}/1234567890/'
    
    • 5
  2. Gilles Quénot
    2023-05-11T22:13:57+08:002023-05-11T22:13:57+08:00

    Usando EREsabor regex:

    $ echo "code=1111111111" | sed -E 's/[0-9]{10}/1234567890/'
    code=1234567890
    
    • 4
  3. Kusalananda
    2023-05-12T17:08:14+08:002023-05-12T17:08:14+08:00

    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 -Eopçã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:

    sed 's/=[0-9]\{10\}$/=1234567890/'
    

    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 codevariável (ou o que quer que codeseja), 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 \1na substituição para reduzir a duplicação):

    sed 's/^\(code\)=[0-9]\{10\}$/\1=1234567890/'
    
    • 4
  4. Stéphane Chazelas
    2023-05-11T23:35:35+08:002023-05-11T23:35:35+08:00

    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:

    sed -E 's/(^|[^0123456789])[0123456789]{10}([^0123456789]|$)/\112345678900\2/'
    

    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 da sedimplementaçã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.6com 1234567890.6ou 1.0000000000e-2com 1.1234567890e-2ou então você pode precisar se adaptar dependendo do que deseja e do que pode encontrar na entrada 0xff0777888999ee.0xff1234567890ee

    Para substituir todas as sequências de 10 e não mais dígitos, isso poderia ser:

    sed -E 's/[0123456789]+/\
    &\
    /g; s/\n[0123456789]{10}\n/123456789/g;s/\n//g'
    

    Ou você pode mudar para perl:

    perl -pe 's/(?<!\d)\d{10}(?!\d)/1234567890/g'
    

    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.

    • 2
  5. Roger Mungo
    2023-05-11T17:58:36+08:002023-05-11T17:58:36+08:00

    Obrigado @Kamil Maciorowski

    Isso funciona bem

    echo "code=1111111111" | sed 's/[0-9]\{10\}/1234567890/'
    
    • 1

relate perguntas

  • Linux grep o que no arquivo 1 está no arquivo 2 [duplicado]

  • como grep linhas após a terceira vírgula com condição

  • remova o número de linhas duplicadas com base na correspondência antes da primeira vírgula

  • Como posso melhorar este script de conversão de personagens?

  • Como remover uma única linha entre duas linhas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve