Não é possível obter o GNU grep 2.12 para manipular caracteres LF na expressão regex

2

Estou nisso há mais de uma hora, mas não consigo descobrir por que não está funcionando.

Estou pesquisando um documento HTML para "\ nAlgum texto". Bastante simples.

Mas ele segue comandos não vai funcionar:

grep -Po '(?s)<h2>\nSome text' input.html > output.html
grep -Po '(?s)<h2>\nSome text' input.html > output.html

Eu preciso da opção "-P", pois o mecanismo regex básico do grep não suporta multilinha.

Eu não sei mais o que tentar. Alguma idéia?

Obrigado.

Edit: O arquivo de entrada simplesmente contém isto:

<h2>LF (ie. \n)
Some text
    
por Gulbahar 14.05.2015 / 23:19

2 respostas

3

Você precisa de duas coisas para corresponder às quebras de linha (daí várias linhas) usando grep :

    A opção
  • -z do mais novo GNU grep , fará com que as linhas sejam separadas por ASCII NUL em vez de quebras de linha

  • (?s) é chamado modificador DOTALL (com grep -P ), fará com que grep corresponda às quebras de linha (LF / CR) por . (ponto)

Portanto, no seu caso, o seguinte deve funcionar:

grep -aPoz '(?s)<h2>.Some text' file.txt

Aqui . corresponderá à nova linha.

Se você tiver CR e LF (ou não), então:

grep -aPoz '(?s)<h2>.{1,2}Some text' file.txt

Como grep estava lendo os primeiros bytes para determinar o tipo de arquivo, portanto, o arquivo estava sendo tratado como um arquivo binário em grep , -a fará com que o arquivo seja tratado como um arquivo de texto.

    
por 15.05.2015 / 00:12
0

O grep procura linhas por padrão e, portanto, normalmente não pode ser usado para encontrar o caractere entre as linhas.

Quando eu procuro por caracteres de nova linha, eu costumo substituir o caractere de nova linha (assumindo quebra de linha do UNIX aqui) com um caractere diferente que eu sei que não existe no texto, assim:

cat file.html | sed 's/\n/%\n/g' | grep '<h2>%' | tr --delete % 

No entanto, parece que você está pesquisando no final de uma linha, que pode ser pesquisada assim:

grep '<h2>$' file.html > newfile.html

desde que $ seja uma regex (7) correspondendo ao final de uma linha ( ^ corresponde ao início).

Edit: Se eu entendi errado (eu suspeito que sim) e você precisa de <h2>\nSome text , em seguida, tente algo como isto:

cat file.html | sed 's/<h2>\n/ñ/g' | grep 'ñSome text' | sed 's/ñ/<h2>\n/g' > newfile.html

usando um caractere diferente (sequência em UTF-8) do que ñ , se você tiver ñ s reais em seu texto.

Ou tente uma combinação:

cat file.html | tr \n % | sed 's/<h2>%/ñ/g' | tr % \n | grep 'ñSome text' | sed 's/ñ/<h2>\n/g'

usando um único caractere (em UTF-8) para % que não é usado no arquivo.

    
por 15.05.2015 / 00:51