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 / 560338
Accepted
RonJohn
RonJohn
Asked: 2020-01-05 10:31:25 +0800 CST2020-01-05 10:31:25 +0800 CST 2020-01-05 10:31:25 +0800 CST

Como selecionar a primeira ocorrência entre dois padrões incluindo apenas o primeiro?

  • 772

Semelhante, mas não exatamente como Como selecionar a primeira ocorrência entre dois padrões, incluindo-os ... dado este arquivo de entrada:

something P1 something
content1
content2
something P1 something
content3
content4

Eu preciso apenas desta saída:

something P1 something
content1
content2
awk sed
  • 4 4 respostas
  • 1360 Views

4 respostas

  • Voted
  1. Best Answer
    Torin
    2020-01-05T10:59:08+08:002020-01-05T10:59:08+08:00

    Uma solução awk:

     awk '/^something P1 something$/{if(++i>1)exit} i' input_file
    

    Isso imprimirá a primeira linha correspondente /^something P1 something$/e todas as linhas até a próxima linha correspondente a esse padrão (mas não incluindo a referida linha) ou o final do arquivo.

    • 4
  2. Ed Morton
    2020-01-05T11:00:42+08:002020-01-05T11:00:42+08:00

    Isto é o que eu suspeito que você realmente quer:

    Para imprimir o primeiro bloco:

    $ awk '$0=="something P1 something"{c++} c==1' file
    something P1 something
    content1
    content2
    

    ou para imprimir o 2º:

    $ awk '$0=="something P1 something"{c++} c==2' file
    something P1 something
    content3
    content4
    

    e assim por diante. Sem uma declaração clara de requisitos, é apenas um palpite.

    • 3
  3. user232326
    2020-01-05T12:32:13+08:002020-01-05T12:32:13+08:00

    awk

    Uma solução geral para o blocoi padrão em awk é:

    awk -v i=1 -v pat='something P1 something'    '$0~pat{i--}i==0'
    

    Explicação:

    -v i=1        # sets the pattern block to print (1 in this case).
    -v pat='...'  # sets the regex pattern that will be tested.
    
    $0~pat        # tests if the input line match the pattern
    {i--}         # If the pattern was found, reduce the count.
    i==0          # If the count has reduced to 0, print the block lines.
    

    Se o padrão que importa é apenas P1, use:

    awk -v i=1 -v pat='P1' '$0~pat{i--}i==0'
    

    Para uma execução mais rápida, saia quando o bloco terminar:

    awk -v i=1 -v pat='P1' '$0~pat{i--}i==0;i<0{exit}'
    

    Se você quiser uma correspondência literal (não um padrão), use:

    awk -v i=1 -v pat='P1' '$0 == pat {i--}; i==0; i<0{exit}'
    

    sed

    Para ir da primeira instância de um padrão para a próxima instância de um padrão, você pode fazer no GNU sed:

    sed -n '/something P1 something/!b;b2;:1;{/something P1 something/q;:2;p;n;b1}'
    

    Pode haver algumas linhas antes da primeira something P1 something.
    O script para (rápido) quando o segundo padrão é encontrado.

    Como ambos os padrões (início e fim) são iguais, podemos reduzir o comando para:

    sed -n -e '/something P1 something/!b;b2;:1;{//q;:2;p;n;b1}'
    

    E para torná-lo mais portátil, use:

    sed -n -e '/something P1 something/!{b' -e '};b2' -e ':1' -e '{//q;:2' -e 'p;n;b1' -e '}'
    
    • 2
  4. Rakesh Sharma
    2020-01-05T18:49:39+08:002020-01-05T18:49:39+08:00
     $ sed -ne '
         /P1/!d
         :loop
            p;n
         //!bloop
         q
     ' file 
    

    Resultados:

    something P1 something1
    content1
    content2
    

    Usando o editor Gnu sed com construção não Posix Q :

    $ sed -e '
       /P1/,/P1/!d
       //!{$q;b;}
       G;/\n./Q;s/\n.*//;h
    ' file
    

    Com apenas construções Posix, fazemos isso:

     $ sed -ne '
          /P1/,/P1/!d
          //!{
            p;$q;d
          }
          G;/\n./q;s/\n.*//p;h
     ' file
    

    Com Perl:

    $ perl -lne '
        next unless $e = /P1/ ... /P1/;
        $e =~ /E/ ? last : print;
    ' file
    

    Ainda outra:

    $ perl -0777 -pe '$_ = /^(.*?P1(?s:.*?\n))(?=.*?P1)/m ? $1 : $,' file
    
    • 2

relate perguntas

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

  • Como remover uma única linha entre duas linhas

  • Reorganize as letras e compare duas palavras

  • Embaralhamento de arquivo de várias 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