Como tratar um arquivo como uma única linha com grep para aplicar um padrão de pesquisa regexp?

3

Eu quero corresponder tudo o que está entre algumas linhas com o regexp, mas não com o início e o fim. Este som para mim como lookbehind positivo e lookahead positivo

    start text
    bla bla 
    bla
    end

Existem vários números desse tipo de blocos, então eu gostaria de extrair todos esses blocos e, em seguida, para cada um desses blocos, eu gostaria de extrair algo com base em um regexp diferente. Então deve ser algo como:

match start 
then match everything until the first occurrence of end
match start 
then match everything until the first occurrence of end

e assim por diante ...

então eu fiz algo assim: (? < = start). * (? = end)

Isso não funciona porque eu acho que eu uso a linha de comando grep, que trata o arquivo como um conjunto de linhas e tenta aplicar o regex em todas as linhas. Existe alguma maneira de tratar o arquivo como uma linha inteira ou isso não é uma boa solução e eu tenho que usar uma combinação de várias ferramentas de linha de comando como extrair o texto com sed e, em seguida, criar um arquivo cujas linhas contém a concatenação de várias linhas do arquivo inicial?

    
por curious 29.11.2011 / 09:26

3 respostas

2

Desde que você me bateu na solução sed, vou postar o equivalente em perl:

perl -ne 'print if/start/../end/'

É um pouco mais detalhado.

    
por 29.11.2011 / 10:09
2

Você pode achar sed mais fácil neste caso.

sed -ne '/start/,/end/p'

Uma expressão sed alternativa que concatena as linhas combinadas:

sed -ne '/start/ba; be;' \
     -e ':a; N; /end/{s/\n/ /g; p; be;}; ba' \
     -e :e

A primeira seção ramifica para rotular a se a linha corresponder a /start/ , caso contrário, ramifica para e (o fim).

A segunda seção percorre as linhas anexando-as ao espaço de padrão até que uma linha correspondente a /end/ seja encontrada, quando substituir as novas linhas por espaços, imprime a linha e então ramifica para e (o final). / p>

A terceira seção apenas fornece o rótulo e .

    
por 29.11.2011 / 09:41
-1
echo "q" | openssl s_client -connect mail.google.com:443 -showcerts 2>/dev/null | 
awk '/-----BEGIN/{flag=1} /-----END/{print;flag=0} flag'
    
por 31.08.2017 / 12:14