Esta pergunta já tem respostas aqui :

Comentários

  • Acho que a outra pergunta é muito específica para ser uma duplicata desta. A maior parte da resposta daqui não ' funcionou lá, pois existem diferentes requisitos (especificando caracteres extras de nova linha).
  • Acho que aqui o início e padrões finais podem estar em qualquer lugar no arquivo (não é necessário fazer com novas linhas), apesar de dado o exemplo específico, o outro pede as linhas inteiras.
  • @kenorb it ' s ainda a mesma ideia. O truque principal é usar uma das ferramentas que podem fazer /foo/,/bar/ para definir padrões. Os detalhes do padrão (estar no final, por exemplo) são secundários.
  • Essa resposta também pode ser aplicável: stackoverflow.com/a/48022994/ 2026975

Resposta

grep ganhou ” para ajudá-lo aqui. Este é um trabalho melhor realizado com sed usando expressões de intervalo:

$ sed -n "/aaa/,/cdn/p" file aaa b12 cdn $ sed -n "/zdk/,/dke/p" file zdk aaa b12 cdn dke 

sed -n suprime a impressão automática, para que as linhas sejam impressas apenas se explicitamente solicitado. E isso acontece quando o intervalo /aaa/,/cdn/ acontece.

Essas expressões de intervalo também estão disponíveis em awk, onde você pode dizer:

awk "/zdk/,/dke/" file 

Claro, todos essas condições podem ser expandidas para um regex mais estrito como sed -n "/^aaa$/,/^cdn$/p" file para verificar se as linhas consistem exatamente em aaa e cdn, nada mais.

Comentários

  • Uau, eu tive o mesmo problema e não ' perguntei. Usei 2 instâncias de grep -n e comparei o número da minha solução.
  • As expressões de intervalo do @KipK são uma ferramenta muito útil para esse tipo de problema:) Você pode também use awk e alguns sinalizadores, mas o caso básico é bastante simples com isso.
  • @Fedorqui, estou tendo problemas se o padrão de pesquisa contiver xmls. tipo, preciso pesquisar começando com < ns0: abcd xmlns = " " >, obtendo o resultado. Mas está mostrando < abcd xmlns = " " > também. Tentei sed -n ' / \ < ns0 \: abcd xmlns \ = \ " \ " \ > /, / \ < ns0 \: abcd \ > / p arquivo
  • @MukulAnand forneça um exemplo para que possamos verificar
  • Qualquer forma de como não imprime o padrão inicial e final (exceto para usar início e fim)?

Resposta

Pode ser feito por sed

sed -n " /^aaa$/,/^cdn$/w output1 /^zdk$/,/^dke$/w output2 " file 

Resposta

Aqui está o grep comando:

grep -o "aaa.*cdn" <(paste -sd_ file) | tr "_" "\n" 

Você pode obter correspondência de várias linhas em grep, mas você precisa usar perl-regexp para grep (-P – que não é compatível com todas as plataformas , como OS X), então, como solução alternativa, estamos substituindo as novas linhas pelo caractere _ e após grep, estamos alterando-os de volta.

Como alternativa, você pode usar pcregrep que suporta padrões de várias linhas (-M).

Ou use ex:

ex +"/aaa/,/cdn/p" -scq! file 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *