Comentários
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
/foo/,/bar/
para definir padrões. Os detalhes do padrão (estar no final, por exemplo) são secundários.