Como fornecer um padrão para uma nova linha no grep? Nova linha no início, nova linha no final. Não é a forma de expressão regular. Algo como \ n.
$
. É um pouco limitado, mas pode ser usado em casos simples.
Como fornecer um padrão para uma nova linha no grep? Nova linha no início, nova linha no final. Não é a forma de expressão regular. Algo como \ n.
$
. É um pouco limitado, mas pode ser usado em casos simples.
Respostas:
grep
os padrões são combinados com linhas individuais, portanto, não há como um padrão corresponder a uma nova linha encontrada na entrada.
No entanto, você pode encontrar linhas vazias como esta:
grep '^$' file
grep '^[[:space:]]*$' file # include white spaces
tente em pcregrep
vez de regular grep
:
pcregrep -M "pattern1.*\n.*pattern2" filename
a -M
opção permite a correspondência em várias linhas, para que você possa pesquisar por novas linhas como \n
.
Graças a @jarno eu conheço a opção -z e descobri que ao usar GNU grep com a opção -P, é possível fazer a correspondência\n
. :)
Exemplo:
grep -zoP 'foo\n\K.*'<<<$'foo\nbar'
Impressões bar
grep -zoPnir "dex\n035" ./dir/
Você pode usar desta forma ...
grep -P '^\s$' file
-P
é usado para expressões regulares Perl (uma extensão para POSIX grep
).\s
corresponder aos caracteres de espaço em branco; se seguido por *
, também corresponde a uma linha vazia.^
corresponde ao início da linha. $
corresponde ao fim da linha. -P
é uma extensão GNU. Posso usá-lo quando a situação exigir (normalmente lookahead / lookbehind), mas POSIX grep pode fazer isso apenas com o arquivo [[:space:]]
.
-P
. GNU é bastante padrão de qualquer maneira. :)
brew install grep
obter o GNU grep, que é superior em vários aspectos. apple.stackexchange.com/questions/193288/…
Quanto à solução alternativa (sem usar não portátil -P
), você pode substituir temporariamente um caractere de nova linha por um diferente e alterá-lo novamente, por exemplo:
grep -o "_foo_" <(paste -sd_ file) | tr -d '_'
Basicamente, ele está procurando uma correspondência exata _foo_
onde _
significa \n
(então __
= \n\n
). Você não precisa traduzi-lo de volta por tr '_' '\n'
, já que cada padrão seria impresso na nova linha de qualquer maneira, então removê-lo _
é suficiente.
<(p paste -sd_ file )
?
new line at the beginning
é uma linha em branco enew line at end
se aplica a todas as linhas do arquivo. Você pode postar um exemplo?