Como pesquiso uma frase em várias linhas? Por exemplo, vamos ter a frase "meu chá gelado", que pode ser embrulhada em arquivos de texto:
as js skdfh dfh djh sf my
ice tea.
O grep não será compatível, pois há uma nova linha no meio. Como eu os jogo? Outro padrão multilinha seriapattern1_\n_pattern2
Eu sei que a maneira mais fácil de fazer ATM é apenas grep para uma parte, por exemplo, apenas gelo com a bandeira -A2 -B2 e, em seguida, nessa saída novamente para, por exemplo, chá. Mas isso é muito entediante. Então, eu estou interessado em como você resolveria isso.
Respostas:
Você pode instalar
pcregrep
(disponível na maioria dos repositórios de distribuição) - o que é grep usando a biblioteca pcre , que faz "Perl Compatible Regular Expressions". Possui uma opção de linha de comando-M
que permite fazer pesquisas em várias linhas - na página do manual :Então você poderia fazer
O
\s
espaço em branco é, que corresponderá\n
e\r
no modo multilinha, além dos caracteres de espaço em branco normais. Você também pode combinar o caractere de nova linha diretamente, para que você possafonte
grep -E
faz padrões PCRE??
,+
,{
,|
,(
, e)
como o seu significado regex usual sem ter que ter um\
na frente, como você faria se você usar grep padrão. Entãogrep 'hello\s\+world' file
é equivalente agrep -E 'hello\s+world' file
. Não funciona com PCRE. Não égrep -P
para expressões regulares perl, mas é experimental (de acordo com a página do manual) e eu acho que é um pouco diferente do pcregrep ...-P
quando disse-E
, mas não sabia que era diferente.Eu provavelmente faria uma pesquisa usando
vim
o:vimgrep
comando 's . Isso funciona de maneira vagamente semelhante à de,grep
mas suporta REs e caminhos do vim.Basicamente, você executa algo como
:vimgrep 'pattern1\npattern2' path/**
uma pesquisa recursiva e digita:copen
para abrir uma janela menor contendo uma lista de correspondências.vim
Os REs podem fazer quase tudo o que os PCREs podem, mas eles evoluíram separadamente da linhagem de expressão regular perl, de modo que a maioria das coisas avançadas funciona de maneira diferente. Sua funcionalidade básica é mais parecida com a dos REs básicos, mas eles têm algumas adições bacanas que os PCREs não oferecem.Não tenho certeza se é possível
:vimgrep
cuspir dados comogrep
faz; Eu só tentei usá-lo para navegação internavim
.:help vimgrep
de dentrovim
para mais informações;:help pattern.txt
para informações sobrevim
REs; para mais informações sobre caminhos, consulte:help wildcards
.fonte
.vimrc
? Deve ser mais portátil do quegrep
em relação ao sistema operacional:vim
não possui um "sabor POSIX" e funciona mais ou menos de forma idêntica, mesmo no Windows. .................................................. ........................... É possível adicionar qualificadores para garantir que, por exemplo, a quantidade certa de "mágica" seja usada no ER, embora Pelo que entendi, existe uma regra estrita e não escrita para deixar essa opção em paz.find.exe
vez degrep
). Houve outra pergunta nas últimas semanas que teve esse problema.:vimgrep
ou:grep
? De:help grep
: "A vantagem do grep interno [ie:vimgrep
] é que ele funciona em todos os sistemas e usa os poderosos padrões de pesquisa do Vim".O Grep funciona apenas em uma linha de cada vez, mas você pode usar o awk para imprimir linhas que correspondam a vários padrões:
combinaria qualquer coisa, não apenas novas linhas entre os dois padrões
fonte
Para tirar o máximo proveito do unix, você precisa tirar proveito dos pipes. Você pode fazer isso de maneira simples
grep
usando tubos (sem necessidade de tee):O que eu não consideraria tedioso.
fonte