
Eu tenho o texto, que contém algumas linhas. Então, preciso fazer o GREP de várias linhas. Por exemplo, tenho texto repetido e devo obter linhas do GREP que contenham essas palavras-chave repetidas.
grep -o "test|test2" textfile
Meu texto:
123|never for your|test
123421|never for your|test2
123412|never for your|test3
12341|never for your|test4
12311|never for your|test2
123312312|never for your|test
123321312|never for your|test2
Eu deveria ter:
123|never for your|test
123421|never for your|test2
123312312|never for your|test
123321312|never for your|test2
Funciona, mas não funciona como eu quero. Ele pesquisa no texto todas as palavras "teste" e "teste2". Mas eu quero obter blocos de texto, como algum padrão, onde somente depois de "teste" vem "teste2". Você tem alguma ideia?
Responder1
Breve script de shell usando sed. Faz uma lista de números de linha para o segundo caso e compara com os números de linha para o primeiro caso. Imprime pares correspondentes. Usa o primeiro argumento como nome do arquivo. Poderia ser facilmente estendido para considerar o segundo e o terceiro argumentos como padrões correspondentes. Poderia salvar como findnext.sh e executar:
$ sh findnext.sh testfile
Deve ser rápido, pois envolve apenas duas passagens no arquivo e tem a vantagem de ser totalmente portátil.
#!/bin/sh
# Line numbers matching test1
mt2=$(sed -ne '/test1/=' < $1 | tr '\n' '/')
for l in $(sed -ne '/test/=' < $1); do
nextline=$(expr $l + 1)
[ "${mt2#*$nextline/}" != "$mt2" ] && sed -ne $l,${nextline}p <$1
done
Responder2
Você pode tentar grep -E ou egrep. Por favor, tente assim
#this will show lines that have test or test2
grep -E "test|test2" file
Se você quiser mostrar a linha que tem test e test2 como este test|test2 faça isso
# This will show lines that has test|test2
grep "test\|test2" file
Responder3
awk
pode ser sua ferramenta para isso:
awk '/test$/, /test2$/' < block-text-lines.txt
a forma geral é:
awk '/start-pattern/, /end-pattern/{command}'
Mas como o padrão do bloco de comando é imprimir, apenas os padrões de início e fim resolvem.
Confira man awk
ou oGuia do usuário do Gnu AwkparacaminhoMais detalhes.
Responder4
grep -A 1 "test$" in.txt | grep -B 1 "test2$"
No manual do grep
-A NUM
Imprime NUM linhas de contexto final após as linhas correspondentes.
-B NUM
Imprima NUM linhas de contexto inicial antes das linhas correspondentes.
O comando grep -Pzo ".*test$\n.*test2$" in.txt
também funciona, mas no manual está "Isso é altamente experimental e grep -P pode alertar sobre recursos não implementados."