pcregrep newline lookbehind erro de asserção?

3

Tentativa de usar pcregrep para imprimir a primeira linha após uma linha em branco. Por exemplo, o conteúdo do arquivo

first line

second line

Eu preciso de second line para ser impresso. Aqui estão alguns testes usando a mesma expressão regular em todo

Com o Python 2.7

python -c "import re; print re.search(r'(?<=\n\n).*?$',\
    open('file').read(), re.MULTILINE).group()"
second line

Com o grep grep 2.16

grep -oPz  '(?<=\n\n).*?$' file
second line

Com o pcregrep versão 8.12

pcregrep -Mo  '(?<=\n\n).*?$' file
(no output)

Com base em alguns testes, pcregrep suporta asserções lookbehind em geral, mas parece não ser capaz de lidar com \n em asserções lookbehind em particular. \n dentro de asserções antecipadas não apresenta problemas.

Testado no RHEL e no Ubuntu. Alguma idéia?

    
por iruvar 02.05.2014 / 02:28

1 resposta

3

Aparentemente, você pode especificar para pcregrep que tipo de nova linha você deseja procurar. A opção -N faz isso quando usa o modo PCRE.

-N newline-type, --newline=newline-type The PCRE library supports five different conventions for indicating the ends of lines. They are the single-character sequences CR (carriage return) and LF (linefeed), the two-character sequence CRLF, an "anycrlf" convention, which recognizes any of the preceding three types, and an "any" convention, in which any Unicode line ending sequence is assumed to end a line. The Unicode sequences are the three just mentioned, plus VT (vertical tab, U+000B), FF (form feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS (paragraph separator, U+2029).

When the PCRE library is built, a default line-ending sequence is specified. This is normally the standard sequence for the operating system. Unless otherwise specified by this option, pcregrep uses the library's default. The possible values for this option are CR, LF, CRLF, ANYCRLF, or ANY. This makes it possible to use pcregrep to scan files that have come from other environments without having to modify their line endings. If the data that is being scanned does not agree with the convention set by this option, pcregrep may behave in strange ways. Note that this option does not apply to files specified by the -f, --exclude-from, or --include-from options, which are expected to use the operating system's standard newline sequence.

Exemplo

$ pcregrep -Mo  -N CRLF '(?<=\n\n).*?$' sample.txt 
second line

$

Outro comportamento estranho

Curiosamente mudar de lookbehind para lookahead produz resultados:

$ pcregrep -Mo  '(?>\n\n).*?$' sample.txt 


second line
$
    
por 02.05.2014 / 03:14