Multiline grepping - O que há de errado com essa expressão?

3

Considere este arquivo de amostra (os números de linha são apenas para referência):

1 Reference duiarneutdigane uditraenturida enudtiar.
2
3 Reference uiae uiaetrtdnsu iatdne uiatrdenu diaren uidtae
4 on line 23.
5
6 uiae
7
8 uaiernd Reference uriadne udtiraeb unledut iaeru uilaedr
9 uiarnde line 234.

Eu estava esperando combinar cada string começando com "Reference" e terminando com um período (ou seja, ll. 1, 3-4 e 8-9) usando este comando grep (tst é o arquivo de amostra):

grep -P '(?s)Reference.*?\.' tst

No entanto, corresponde apenas à primeira linha. O que eu estava pensando:

  • (?s) , então . corresponde a todos os caracteres, incluindo novas linhas
  • .*? deve tornar a estrela não-gananciosa, por isso não corresponde ao arquivo inteiro se terminar com um ponto final.
  • A expressão deve terminar com um período literal \. .

Eu também experimentei o -z flag do awk e do grep, mas com ambos recebo todas as linhas ou nem todas as linhas correspondem às minhas expressões.

    
por bleistift2 18.02.2017 / 23:30

1 resposta

3

Você pode usar isto:

grep -Pzo '(?s)Reference.*?\.' tst.txt

onde tst.txt é seu arquivo de entrada. É o mesmo regex que o seu, mas com duas novas bandeiras.

Eu adicionei o sinalizador -z para suprimir a nova linha no final da linha, substituindo-o por caractere nulo. Assim, grep sabe onde o fim da linha é, mas vê a entrada como uma grande linha.

O sinalizador -o significa que ele imprime apenas a parte correspondente.

Eu recebi a seguinte saída:

Reference duiarneutdigane uditraenturida enudtiar.
Reference uiae uiaetrtdnsu iatdne uiatrdenu diaren uidtae
on line 23.
Reference uriadne udtiraeb unledut iaeru uilaedr
uiarnde line 234.

Espero que isso ajude.

    
por 19.02.2017 / 00:16