GNU grep verifica se a entrada contém um caractere LF

3

Eu testo o conteúdo de um conjunto de arquivos de dados, se eles contêm pelo menos um de um conjunto de caracteres que consiste em caracteres de impressão e não-impressão.

Meu último problema é detectar se o arquivo contém um feed de linha. Meu GNU grep 3.0 afirma que cada entrada contém um LF ... Por que isso?

echo -n "test" | grep -UF -e $'\x0a'

Alguma ideia? Eu suspeito de alguma interferência EOL / EOF implícita.

    
por Yuri 26.07.2018 / 11:32

2 respostas

10

O grep é orientado à linha - se a entrada não terminar com uma nova linha, ele ainda considera o texto após a última nova linha (ou início do arquivo) como uma linha.

Os programas orientados a linhas são inadequados para processar diretamente arquivos binários - eles geralmente têm casos patológicos se um arquivo binário tiver uma "linha" particularmente longa.

Em vez disso, considere algo como uma combinação de tr e cmp :

$ echo -n foo | tr -d -c $'\n' | cmp /dev/null - 
# no output and exits with status 0

$ echo foo | tr -d -c $'\n' | cmp /dev/null -
cmp: EOF on /dev/null which is empty
# exits with status 1

Esse método também tem a vantagem de precisar ler a entrada apenas até o primeiro caractere de nova linha (mais buffer).

    
por 26.07.2018 / 11:45
3

De a especificação POSIX de grep :

Regular expression matching shall be based on text lines. Since a <newline> separates or terminates patterns [...], regular expressions cannot contain a <newline>. Similarly, since patterns are matched against individual lines (excluding the terminating <newline> characters) of the input, there is no way for a pattern to match a <newline> found in the input.

Para verificar se a entrada contém um caractere de alimentação de linha, que é o mesmo que um caractere de nova linha no Unix, você pode contar o número de linhas com wc -l :

lines=$( wc -l <inputfile )
if [ "$lines" -gt 0 ]; then
    echo 'Input had a linefeed character in it'
fi

Ou, se você tiver uma string:

lines=$( printf '%s' "$string" | wc -l )
# etc.
    
por 26.07.2018 / 11:43

Tags