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 / ubuntu / Perguntas / 1058403
Accepted
Pilot6
Pilot6
Asked: 2018-07-23 07:29:38 +0800 CST2018-07-23 07:29:38 +0800 CST 2018-07-23 07:29:38 +0800 CST

Como obter o modo de modem usando sed ou awk de uma saída de modem?

  • 772

Não sou especialista em bash e tenho problemas para filtrar a substring correta.

Eu tenho

echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,,"

que resulta como

AT^SYSCFGEX=\"0201\",3fffffff,2,4,7fffffffffffffff,,

Como posso obter 0201o resultado? Estou lutando com isso.

command-line text-processing
  • 4 4 respostas
  • 364 Views

4 respostas

  • Voted
  1. Best Answer
    dessert
    2018-07-23T07:37:06+08:002018-07-23T07:37:06+08:00

    Comsed

    sed -r 's/[^0-9]*([0-9]+).*/\1/'
    

    extrai o primeiro número da string.

    execução de exemplo

    $ echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,," | sed -r 's/[^0-9]*([0-9]+).*/\1/'
    0201
    

    Explicações

    • -r– usar expressões regulares estendidas
    • s/a/b/- substituir aporb
    • [^0-9]*– pegue tudo, exceto um dígito, aqui correspondeAT^SYSCFGEX=\"
    • ([0-9]+)– pegue pelo menos um dígito e salve em um grupo, aqui corresponde0201
    • .*– pegue todo o resto da linha, aqui combina\",3fffffff,2,4,7fffffffffffffff,,
    • \1- obtenha o conteúdo do primeiro grupo salvo antes
    • 4
  2. Byte Commander
    2018-07-23T07:43:31+08:002018-07-23T07:43:31+08:00

    Aqui está uma alternativa usando grepno modo PCRE ( -P) com lookarounds regex, mostrando apenas as partes correspondentes de cada linha ( -o):

    grep -Po '(?<=\\")\d+(?=\\")'
    

    Isso corresponde a todos os números que estão entre aspas duplas com barra invertida, como \"0201\", mas sem retornar as aspas no resultado.

    • (?<=\\")é um lookbehind, que corresponde a uma string vazia se for precedida pelo padrão interno ( \").
    • \d+corresponde a um ou mais dígitos.
    • (?=\\")é um lookahead, que corresponde a uma string vazia se for seguida pelo padrão interno ( \").

    Exemplo:

    $ echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,," | grep -Po '(?<=\\")\d+(?=\\")'
    0201
    
    • 3
  3. dessert
    2018-07-23T07:53:04+08:002018-07-23T07:53:04+08:00

    Com basha Expansão de Parâmetros

    Se você quiser usar apenas, bashvocê pode fazer assim:

    $ var="AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,,"
    $ echo ${var#*\"}
    0201\",3fffffff,2,4,7fffffffffffffff,,
    $ var=${var#*\"}
    $ echo ${var%%\\\"*}
    0201
    

    Explicações

    • ${var#*\"}– expande para o conteúdo da variável varcom a correspondência de padrão *"(ou seja, tudo até ") removido desde o início
    • ${var%%\\\"*}– expande para o conteúdo da variável varcom a correspondência de padrão \"*(ou seja, tudo de \") removido do final.

    Leitura adicional

    • Bash Hackers Wiki: Expansão de Parâmetros
    • man bash/EXPANSÃO/Expansão de Parâmetros
    • 2
  4. Sergiy Kolodyazhnyy
    2018-07-23T12:08:36+08:002018-07-23T12:08:36+08:00

    Aqui está uma awkabordagem. A ideia aqui é que awk(ou para ser preciso, GNU awk) pode usar vários caracteres como separadores. Assim, podemos usar \e "como separadores, para extrair a string desejada com:

    awk -F '[\\\\"]' '{print $3}'
    

    Observe os múltiplos \, que são necessários para escapar da barra invertida e evitar que ela seja interpretada pelo shell como escape para o próximo caractere.

    Com o echocomando na pergunta,

    $ echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,," | awk -F '[\\\\"]' '{print $3}'
    0201
    

    Alternativamente, poderíamos apenas usar "como separador e cortar a última função \via substr():

    $ echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,," | awk -F '"' '{print substr($2,1,length($2)-1)}'
    0201
    
    • 1

relate perguntas

Sidebar

Stats

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

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

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