Encontrando certas strings com grep (ou similar)

1

Eu tenho duas partes de uma string que eu conheço, chamadas phrase1 e phrase2 , que estão na mesma linha de um arquivo que ocorre várias vezes em todo o arquivo. Eu preciso extrair essas linhas do arquivo; no entanto, existem números que eu não sei e as linhas podem variar. Por exemplo, existem linhas que podem parecer:

phrase1 654654 phrase2
phrase1 22 phrase2
phrase1 949 phrase2

etc. 

No entanto, sei que posso escrever um código especificamente para uma linha específica. Por exemplo, posso escrever para a linha 2 acima do seguinte para encontrá-lo:

grep "phrase1 [0-9][0-9] phrase2" file

Qual código eu posso escrever usando o grep (ou similar) para extrair todas as linhas contendo phrase1 e phrase2 sem saber os números, ou qualquer outra coisa, entre eles?

    
por The Inquiring Robot 20.11.2013 / 20:32

3 respostas

2

Dois métodos: com expressões regulares:

grep "phrase1 .* phrase2" file

Esta pesquisa por frase1, um espaço, uma sequência de caracteres que pode ser o que você quiser, outro espaço e a frase2, em qualquer lugar da linha (corresponde a linhas com mais material antes de "frase1" e depois de "frase2" )

Se as duas frases tiverem que estar no início e no fim da linha, veja @AndreasT answer: você pode usar ^ e $ para "ancorar" a expressão regular no início e no final da linha.

Se você quiser combinar apenas os números entre as duas frases, a resposta de minerz029 é a correta; "[0-9] +" corresponde a uma repetição de dígitos ("+" significa "uma sequência de pelo menos um caractere").

Se você quiser apenas números e frase1 e frase2 devem estar no início e no final da frase, combine os dois:

grep "^phrase1 [0-9]+ phrase2$" file

Ou o "truque" / hack ...

grep "phrase1" file | grep "phrase2"

Explicação: o primeiro comando procura todas as ocorrências de frase1 e, em seguida, "canaliza" as linhas resultantes como entrada para o segundo grep, que gera todas as linhas correspondentes a frase2.

No entanto, conforme notado por @AndreasT, esse segundo método corresponde ao padrão reverso "frase2 ... frase1", que pode ser indesejado.

    
por Rmano 20.11.2013 / 20:37
1

Se as linhas que você está procurando iniciar com phrase1 e terminar com phrase2 , sugiro

grep "^phrase1.*phrase2$"

Aqui está uma lista dos caracteres especiais usados

  • ^ corresponde ao início de uma linha
  • $ corresponde ao final de uma linha
  • . corresponde a todos os caracteres
  • * corresponde a 0 ou mais ocorrências do caractere anterior

Então, basicamente, grep procura linhas que começam com phrase1 , seguidas por 0 ou mais caracteres e terminam com phrase2 .

    
por AndreasT 21.11.2013 / 11:28
1

Use isso para detectar apenas dígitos entre as frases:

grep -E '^phrase1 [0-9]+ phrase2$'

A opção -E usa "Expressões regulares estendidas", adicionando suporte ao operador + .

Divisão:

  • ^ significa corresponder ao início da linha.
  • + após o [0-9] significa procurar uma ou mais ocorrências da expressão anterior, que neste caso é a classe [0-9] .
  • $ significa corresponder ao final da linha.
por kiri 21.11.2013 / 11:34