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.
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?
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.
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
.
echo "q" | openssl s_client -connect mail.google.com:443 -showcerts 2>/dev/null |
awk '/-----BEGIN/{flag=1} /-----END/{print;flag=0} flag'
Tags grep regular-expression