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 / 449039
Accepted
Adrian Maire
Adrian Maire
Asked: 2018-06-11 23:41:51 +0800 CST2018-06-11 23:41:51 +0800 CST 2018-06-11 23:41:51 +0800 CST

Pesquisando correspondência de regex de várias linhas em arquivos (sem pcregrep)

  • 772

Pergunta:

Como posso encontrar correspondências de uma expressão regular de várias linhas em arquivos, sem pcregrep?

Preciso encontrar/imprimir a posição de cada ocorrência.

Infelizmente, o pcregrep não está presente e não tenho direitos para instalá-lo. Outras alternativas são grep perl sed pythonetc.

Um exemplo de expressão regular para pesquisar é:

Text\nLine

Contexto:

Um script fornece centenas de MB de texto estruturado em algumas dezenas de arquivos, mas infelizmente algumas linhas estão faltando (por vários motivos). Eu preciso verificar onde essas linhas estão faltando, procurando assim a sequência das linhas anteriores e seguintes.

Text
Missing //this line is sometimes missing.
Line

EDITADO:

Possível entrada

exemplo.txt

Text
Missing
Line

Text
Missing
Line

Text
Line

Text
Missing
Line

Saída possível:

exemplo.txt, linha 10

Algumas das tentativas sem sucesso:

pcregrep 
    # command not found
apt-get install pcregrep 
    # no permission, no su credentials, distro don't provide pcregrep, outdated sources, customer does not want changes on the serve, etc.
sed -r 's#(Text\nLine)#\1#' ./* 
    # print all lines, not only matches, no indication of file or line, etc.
grep 'Text\nLine' ./* 
    # Does not works on multi-lines
sed -n '/Text/,/Line/{p}' ./* 
    # Not the same regex, does not indicate result lines, etc.
text-processing regular-expression
  • 3 3 respostas
  • 1194 Views

3 respostas

  • Voted
  1. Best Answer
    Kusalananda
    2018-06-12T00:49:27+08:002018-06-12T00:49:27+08:00

    As ferramentas Unix geralmente são orientadas a linhas e, portanto, não há como aplicar uma expressão regular em várias linhas de entrada usando a caixa de ferramentas padrão.

    sedpode ser feito para processar o arquivo de forma que seja capaz de detectar as linhas que você está procurando, mas fazemos isso estritamente usando operações em linhas individuais:

    $ sed -n '/^Text/{N;/^Text\nLine/=;D;}' file
    10
    

    Este sedscript procura a string Textno início de uma linha. Quando encontrado, ele anexa a próxima linha ao seu buffer com um \nintermediário.

    Se o buffer agora corresponder ^Text\nLine, o número da linha atual será gerado usando o =comando em sed. O número da linha de saída é o da Linelinha no arquivo.

    Observe que, embora a segunda expressão regular pareça corresponder a uma nova linha no arquivo, ela não corresponde. Ele corresponde a uma nova linha em seu buffer interno, que colocamos lá usando o Ncomando quando lemos a próxima linha do arquivo.

    Você provavelmente usaria isso em um loop se desejasse aplicá-lo a vários arquivos:

    for name in pattern; do
        printf 'Processing %s...\n' "$name"
        sed -n '/^Text/{N;/^Text\nLine/=;D;}' "$name"
    done
    

    onde patternseria um padrão de globbing de nome de arquivo comum que corresponda aos arquivos em que você está interessado.

    • 2
  2. Stéphane Chazelas
    2018-06-12T01:49:04+08:002018-06-12T01:49:04+08:00

    Se vimestiver instalado, você pode usá-lo no exmodo como:

    vim -e -s -c 'argdo g/^Text\nLine/#' -c q ./*.txt
    

    Veja também o zcomando para dar contexto.

    vim -e -s -c 'argdo g/^Text\nLine/z#.5' -c q ./*.txt
    

    Isso não imprime os nomes dos arquivos. Uma abordagem não muito eficiente perlpoderia ser:

    perl -l -0777 -ne 'while (/Text\nLine/g) {
       print "$ARGV, line " . ++(() = $` =~ /\n/g)}' ./*.txt
    
    • 1
  3. Rakesh Sharma
    2018-06-12T16:01:03+08:002018-06-12T16:01:03+08:00
     perl -ne 'eof and $. = 0 or /^Text/ && ($_ .= <>) =~ /^Line/m && print "$ARGV: $.\n"' ./*
    

    Isso imprimirá o nome do arquivo junto com o número da linha onde ocorreu a correspondência.

    Além disso, o contador de linha ($.) é redefinido ao atingir o fim de cada arquivo.

    • 0

relate perguntas

  • menos: várias condições de filtro com AND

  • Reorganize as letras e compare duas palavras

  • Subtraindo a mesma coluna entre duas linhas no awk

  • Embaralhamento de arquivo de várias linhas

  • como posso alterar o caso do caractere (de baixo para cima e vice-versa)? ao mesmo tempo [duplicado]

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 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

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 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
    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
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +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
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +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