Imprimindo linhas em um arquivo da correspondência para corresponder

1

Qual é uma boa maneira de imprimir todas as linhas em um arquivo da linha que contém ^# fish, para (mas não incluindo) a próxima linha contendo ^# ?

    
por Toothrot 03.03.2017 / 11:17

2 respostas

4

Com o AWK:

awk '/^#/ { inblock = 0 }; /^# fish/ { inblock = 1 }; inblock'

Isso realmente imprimirá todos os blocos que começam com # fish . Para parar depois do primeiro bloco:

awk 'inblock && /^#/ { exit }; /^# fish/ { inblock = 1 }; inblock'

Ambas as variantes funcionam definindo uma variável inblock para 1 ao processar linhas no bloco interessante; a última instrução inblock aplica a ação padrão (imprime a linha atual) quando inblock é 1.

    
por 03.03.2017 / 11:20
1

Perl

O regex procura repetidamente por fragmentos que começam no line boundary # fish e termina no mais curto (não-ganancioso) # adjacente a uma nova linha ou no final do próprio arquivo. A parte correspondente é então impressa.

perl -l -0777ne 'print $& while /^#\sfish.+?(?=\n(?:#|\z))/msg' yourfile


sed -e '
   /^# fish/!d;          # havent yet seen the fish, so skip
   $b; N;                # seen the fish so grab the next line unless its the last in which case promptly show and quit
   /\n#/!s/^/\n/;        # not seen a line with "#" so go read next
   /^\n/D;               # 
   h;                    # whole block /# fish/.../#/ with us now
      s/\(.*\)\n.*//;  # remove the last line, i.e., trailing # line
      p;                 # show the block now
   g;                    # retrieve orig unmodified block
   s/.*\n/\n/; D;        # keep the last line and go back for more...
' yourfile
    
por 03.03.2017 / 15:04