Padrão multilinhas do Grep

12

Como pesquiso uma frase em várias linhas? Por exemplo. Vamos ter a frase "meu chá gelado", então ele pode ser envolto em arquivos de texto:

as js skdfh dfh djh sf my
ice tea.

o grep não corresponderá, pois há uma nova linha no meio. Como faço para combinar isso? Outro padrão multilinha seria pattern1_\n_pattern2

Eu sei que a maneira mais fácil que eu faço ATM é apenas grep por uma parte, e. apenas gelo com o sinalizador -A2-B2 e depois nessa saída durante, por ex. chá. Mas isso é muito tedioso. Então, eu estou interessado em saber como você resolveria isso.

    
por math 20.07.2010 / 11:56

4 respostas

14

Você pode instalar pcregrep (disponível na maioria dos repositórios de distribuição) - que é grep usando a biblioteca de computadores , que faz "Perl Compatible Regular Expressions". Ele tem uma opção de linha de comando -M que permite fazer pesquisas de várias linhas - do homem página :

"The output for any one match may consist of more than one line."

Então você poderia fazer

pcregrep -M 'my\s+ice\s+tea' filename

O \s é espaço em branco, que corresponderá a \n e \r no modo multilinha, além dos caracteres normais de espaço em branco. Você também pode combinar o caractere de nova linha diretamente, então você poderia fazer

pcregrep -M 'pattern1_\n_pattern2' filename
    
por 20.07.2010 / 15:55
3

Eu provavelmente faria uma pesquisa usando o comando vim ' :vimgrep '. Isso funciona de uma maneira vagamente semelhante à de grep , mas suporta REs e caminhos do vim.

Basicamente, você executa algo como :vimgrep 'pattern1\npattern2' path/** para uma pesquisa recursiva e, em seguida, digita :copen para exibir uma janela menor contendo uma lista de correspondências.

vim REs podem fazer praticamente tudo que os PCREs conseguem, mas evoluíram separadamente da linhagem de expressões regulares perl, então a maioria das coisas avançadas funciona de maneira diferente. Sua funcionalidade básica é mais parecida com as REs básicas, mas elas têm algumas adições interessantes que os PCREs não oferecem.

Não tenho certeza se é possível obter :vimgrep para exibir dados como grep ; Eu só tentei usá-lo para navegação dentro de vim .

:help vimgrep de vim para mais informações; :help pattern.txt para informações sobre vim REs; para mais informações sobre caminhos, consulte :help wildcards .

    
por 20.07.2010 / 12:18
2

O grep só funciona em uma linha por vez, mas você pode usar o awk para imprimir linhas que correspondam a um intervalo de padrões:

cat file | awk '/foo/,/bar/'

ele corresponderia a qualquer coisa, não apenas a novas linhas entre os dois padrões

    
por 20.07.2010 / 17:15
0

Para aproveitar ao máximo o unix, você precisa aproveitar os canais. Você pode fazer isso em grep usando canos (sem necessidade de tee):

$ grep -A1 "pattern1" file.txt |  grep "pattern2"

Que eu não consideraria tedioso.

    
por 12.02.2015 / 12:13